SchoolLinkedinTwitterFacebookPinterestVKEmailPrintGenStageこの和訳は最新です。このレッスンでは、GenStageをどのように扱うのか、アプリケーションでどのように活用できるのかを詳しく見ていきます。公式ドキュメントによると「Elixir向けの仕様と計算フロー」とされていますが、これはいったいどういう意味なのでしょうか?つまるところGenStageは、個別のプロセスで独立したステップ(ステージ)によって実行される、処理のパイプラインを定義する方法を提供します。パイプラインを使った処理をした経験がある方なら、こうした概念はよくご存知でしょう。この仕組みがどうやって動くかをより良く理解するために、単純な生産者-消費者のフローを以下に図示します。いう、3つのステージがあります。よって受信される新しい値を返します。次のセクションで説明するようにステージの役割は重要です。この例では、1対1の生産者対消費者となっていますが、どのステージにおいても、両方とも複数の生産者、複数の消費者を持つことが可能です。この概念をより詳しく説明するために、GenStageを使ってパイプラインを構築しますが、まずはじめにGenStageの各役割をもう少し深く掘り下げてみましょう。消費者と生産者これまで見てきたように、ステージに与えられた役割は大切です。GenStageの仕様では以下の3つの役割があります。生産者は消費者からの催促を待ち、要求されたイベントに応じる。送り元と受け手の両方。生産者-消費者は、生産者からの要求イベントと同じように、他の消費者からの催促に応じる。消費者は、生産者に要求してデータを受け取る。ことに注意してください。GenStageでは、消費者が上流の生産者に催促を送り、生産者から送られてくるデータを処理します。これによって、バックプレッシャーとして知られる仕組みが容易になります。バックプレッシャーというのは、消費者の処理がビジーの時に過剰なプレッシャーがかからないよう、生産者側にその責任を負わせる仕組みです。GenStageの内部の役割についておさらいしたところで、実際のアプリケーションを作ってみましょう。はじめにこの例では、数値を生成し、偶数をソートし、そして最後にそれらを出力するGenStageアプリケーションを構築します。このアプリケーションでは、3つのGenStageの役割を全て使います。「生産者」は、数を数えたり出力したりする責任があります。「生産者-消費者」は、偶数だけにフィルタリングし、下流から来る催促に応えます。最後に、数字を表示する「消費者」をつくります。スーパーバイザーツリーを持つmixプロジェクトを作成しましょう。]endこの先に進む前に、依存ライブラリを取得してコンパイルを通しておきましょう。compile生産者を構築する準備が整いました!生産者GenStageアプリケーションの第一歩は、生産者の作成です。先ほど述べたように、一定の数のストリームを生成する生産者を作成する必要があります。初期状態をセットしますが、もっと大切なのは自分自身に「生産者」とラベル付けすることです。関数からの戻り値で自身のプロセスを分類します。関数は生産者の大部分がある場所ですが、この関数は全てのGenStage生産者が実装しなければなりません。ここで消費者によって催促された数のセットを返し、カウンターを増やします。なっていますが、これは処理可能なイベントの数に対応する整数として表されています(デフォルト値は1000です)。数を生成する生産者ができたので、今度は生産者-消費者に移りましょう。生産者に数を催促し、数をフィルターして偶数のみに絞り、消費者からの催促に応えたいと思います。導入したことに気づかれたかもしれません。オプションを用いて、ある特定の生産者と通信することをGenStageに指示しています。関数は、入ってくるイベントを受取って処理し変換した値の集合を返す場所です。関数の戻り値とその使用方法です。numbers)が下流の消費者からの要求を満たすために使われます。消費者側ではこの値は破棄されます。最後に消費者があります。endend前のセクションで学習したように、消費者はイベントを出力しないので、タプルの2番目の値は破棄されます。全部まとめるさて、生産者、生産者-消費者、そして消費者が生まれた今、すべてを結びつける準備が整いました。ファイルを開いて、スーパーバイザーツリーにこれらの新しいプロセスを追加しましょう。opts)endもし間違いが一つもなければ、このプロジェクトを実行すると全てが正しく動くはずです。ここに処理パイプラインがあります。生産者は数字を出力し、生産者-消費者は奇数を破棄して、そして消費者はそれらの数を表示するというフローを続けています。複数の生産者もしくは消費者イントロダクションで言及したように、1つ以上の生産者、または、消費者を持つことができます。出力を調べると、各々のイベントは単一のPIDによって処理されていることがわかります。修正して複数のワーカーが動くように少し調整してみましょう。2)]ここで2つの消費者を設定してアプリケーションを実行するとどうなるか、見てみましょう。:state_doesnt_matter}見ての通り、単に一行のコードを付け足し、消費者のIDを与えただけで、複数のPIDができました。ユースケースはどのようなものがあるのでしょうか。生産者は、単純な数値ジェネレータである必要はありません。Kafkaのような別のデータソースからイベントを生成することもできます。生産者-消費者と消費者を組み合わせれば、それらが利用可能になった時に、メトリクスを処理したりソートしたりカタログ化したり保存したりすることができます。イベントはどんなものでもありえますが、一連の消費者によって実行される、まとまった処理を生成することができます。データパイプラインと同様に、ソースからリアルタイムで出力されたイベントに対し、受信し、処理し、並べ替えたり等の処理することができます。これらは、GenStageで出来ることのほんの数例にすぎません。