[Elixir]read GenStage and try a bit

GenStageの0.3.0がリリースされたと合わせて、GenStageに関してのアナウンスがされたので触ってみました。合わせて、GenEventの問題点や解決したい問題がかかれているので参考になると思います。

http://elixir-lang.org/blog/2016/07/14/announcing-genstage/

GenStageとは

https://github.com/elixir-lang/gen_stage#genstage

に書いている通り、producerとconsumerの別れた役割を持つプロセスの間のイベントをやりとりするためのライブラリです。

GenEventだとイベントを1つの1つのプロセスで処理していたので、何かエラーが発生した時にsupervisorを再起動するというような戦略が取れないことだったりなど、データの流れを考える上で平行処理やその周辺に開発者が気を配らないといけない、と手間がかかっていました。そのため、開発者がデータの処理に集中できるように、そこら辺をいい感じにしてくれるものを用意するために作られたものがこれのようです。

3つの役割

GenStageは、0.3.0現在は3つの役割を持つことができます。

  1. producer
  2. consumer
  3. producer_consumer

1は、callbackの実装時に handle_demand/2 を実装する必要があります。これは、2や3から要求が来た時に行う処理を書きます。2と3は handle_events/3 を実装する必要があります。これは、イベントを得た時に行う処理を書きます。

関係性の定義

GenStage.sync_subscribe c, to: b のように書くことで、このcとbの間にはconsumer(c)とproducer(b)の関係ができます。つまり、cからbに要求が送られ、それに対して行われた要求が処理されcに対して応答として帰ってきます。ここでは sync_subscribe/3 なので、同期的な挙動を行います。一定時間応答がなかったらtimeoutに成るし、そうなるまでcはbから返答を待ちます。

他にも async_subscribe/2 も存在して、これはこの関係が非同期的に行われる、ということですね。

https://hexdocs.pm/gen_stage/Experimental.GenStage.html#async_subscribe/2
https://hexdocs.pm/gen_stage/Experimental.GenStage.html#sync_subscribe/3

これらの関係性がわかるサンプル実装が以下にあります。
https://github.com/elixir-lang/gen_stage/blob/master/examples/producer_consumer.exs

最後に

GenStageはまだ開発中で、 Experimental.GenStage.Flow の実装を控えているそうです。今はまだプロトタイプとしてのドキュメントが以下にあるだけですが、外部データの流れをうまく扱う Flow を練っているようですね。

https://hexdocs.pm/gen_stage/Experimental.GenStage.Flow.html

ここら辺は以下のような使い方に寄与するみたいです。

Developers who maintain libraries that integrate with external data sources, be it a RabbitMQ, Redis or Apacha Kafka, can explore GenStage as an abstraction for consuming data from those sources. Library developers must implement producers and leave it up for their users to plug the consumer stages.

私のお試し。
https://github.com/KazuCocoa/my_gen_stage

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中