20

In Akka streams what does Mat in Source[Out, Mat] or Sink[In, Mat] represent. When will it actually be used?

4

1 に答える 1

41

Mattype パラメーターは、このストリームの実体化された値の型を表します。

AkkaSourceでは , Flow, Sink(つまり、すべてのグラフ) は単なる青写真であることを思い出してください。それらは単独で処理を行うわけではなく、ストリームの構築方法を記述するだけです。これらのブループリントをライブ データを含む作業ストリームに変換するプロセスは、マテリアライゼーションと呼ばれます。

ストリームを具体化するためのコア メソッドは と呼ばれ、クラスrun()定義さRunnableGraphれます。ストリームを実行する他のすべてのメソッド (または など)runWithは、最終的にこのメソッドに委任されます。このメソッドが を返すことがわかります。つまり、ストリームを具体化すると、具体化された値が生成されます。SinkSourceMat

たとえば、ストリーム内のすべての値を単一の値に結合するシンクがあり、それは で構築されSink.foldます。しかし、どうやってこの値を取得しますか? ストリームは非同期で実行されるため、この値の自然な型は になりますFuture[T]。ここTで、 はフォールド アキュムレータの型です。つまり、これは具体化された値であるため、具体化するとインスタンスが取得され、そのインスタンスを独自のコードで使用してさらに処理できSink.foldます。ストリームが正しく完了すると、値で完了しますストリームが例外で終了した場合、失敗して完了します。Sink[In, Future[T]]Future[T]Future[T]

シンク、ソース、フロー (およびその他の種類のグラフ) を組み合わせて構築するグラフの各部分には、具体化された値が関連付けられている可能性があります。たとえば、 の具体化された値Source.queueは、要素が具体化された後にストリームにプッシュするために使用できるキューであり、 の具体化された値はSink.actorSubscriberActorRefアクター (ストリームが実行されるときにマテリアライザーによって作成される) と対話するために使用できる です。具現化)。一方、Flow.map意味のある具体化された値を持たないフロー (ストリームに純粋な関数を適用するだけでは外部から制御できるものは何もない) があるため、その具体化された値はNotUsedであり、本質的にはUnitです。

当然のことながら、ストリームのさまざまな部分に独自の具体化された値が含まれている可能性があります。たとえば、Source.queueとを組み合わせることを妨げるものは何もありませんSink.fold。ただし、RunnableGraph.run()実体化された値を 1 つしか返すことができません。これを克服するために、通常、Sinks、Flows、およびその他のグラフのメソッドを結合する 2 つのバリアントがあり、通常は likemethodmethodMat、たとえばtoandと呼ばれtoMatます。2 番目のバリアントでは、結合するストリームの具体化された値を結合する方法を選択できます。たとえば、それらをタプルに入れて両方を取得できます。

val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail)
  .map(x => x + 10)
  .toMat(Sink.fold(0)(_ + _))(Keep.both)
  .run()

デフォルトの組み合わせメソッド (Mat接尾辞なし) は、通常、この特定の種類のストリームに対して行う最も自然な方法に応じて、左または右の実体化された値のいずれかを選択します。オブジェクトにはKeep、特にメソッドの最後の引数として使用する目的で、左、右、または両方の引数を返す便利なメソッドが含まれてい*Matますが、独自の結合関数を作成することを妨げるものは何もありません。

于 2016-09-27T15:49:02.870 に答える