In Akka streams what does Mat in Source[Out, Mat] or Sink[In, Mat] represent. When will it actually be used?
1 に答える
Mat
type パラメーターは、このストリームの実体化された値の型を表します。
AkkaSource
では , Flow
, Sink
(つまり、すべてのグラフ) は単なる青写真であることを思い出してください。それらは単独で処理を行うわけではなく、ストリームの構築方法を記述するだけです。これらのブループリントをライブ データを含む作業ストリームに変換するプロセスは、マテリアライゼーションと呼ばれます。
ストリームを具体化するためのコア メソッドは と呼ばれ、クラスrun()
で定義さRunnableGraph
れます。ストリームを実行する他のすべてのメソッド (または など)runWith
は、最終的にこのメソッドに委任されます。このメソッドが を返すことがわかります。つまり、ストリームを具体化すると、具体化された値が生成されます。Sink
Source
Mat
たとえば、ストリーム内のすべての値を単一の値に結合するシンクがあり、それは で構築されSink.fold
ます。しかし、どうやってこの値を取得しますか? ストリームは非同期で実行されるため、この値の自然な型は になりますFuture[T]
。ここT
で、 はフォールド アキュムレータの型です。つまり、これは具体化された値であるため、具体化するとインスタンスが取得され、そのインスタンスを独自のコードで使用してさらに処理できSink.fold
ます。ストリームが正しく完了すると、値で完了しますストリームが例外で終了した場合、失敗して完了します。Sink[In, Future[T]]
Future[T]
Future[T]
シンク、ソース、フロー (およびその他の種類のグラフ) を組み合わせて構築するグラフの各部分には、具体化された値が関連付けられている可能性があります。たとえば、 の具体化された値Source.queue
は、要素が具体化された後にストリームにプッシュするために使用できるキューであり、 の具体化された値はSink.actorSubscriber
、ActorRef
アクター (ストリームが実行されるときにマテリアライザーによって作成される) と対話するために使用できる です。具現化)。一方、Flow.map
意味のある具体化された値を持たないフロー (ストリームに純粋な関数を適用するだけでは外部から制御できるものは何もない) があるため、その具体化された値はNotUsed
であり、本質的にはUnit
です。
当然のことながら、ストリームのさまざまな部分に独自の具体化された値が含まれている可能性があります。たとえば、Source.queue
とを組み合わせることを妨げるものは何もありませんSink.fold
。ただし、RunnableGraph.run()
実体化された値を 1 つしか返すことができません。これを克服するために、通常、Sink
s、Flow
s、およびその他のグラフのメソッドを結合する 2 つのバリアントがあり、通常は likemethod
とmethodMat
、たとえばto
andと呼ばれ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
ますが、独自の結合関数を作成することを妨げるものは何もありません。