Via/ViaMat/to/toMat в потоке Akka

Может кто-нибудь ясно объяснить, в чем разница между этими 4 способами? Когда более целесообразно использовать каждый из них? Также, вообще говоря, как называется эта группа методов? Есть ли еще один метод, который выполняет ту же работу? Также может помочь ссылка на скаладок.

Д -

Ответ 1

Все эти методы необходимы для объединения двух потоков в один поток. Например, вы можете создать Source из Source и Flow, или вы можете создать Sink из Flow и Sink, или вы можете создать Flow из двух Flow s.

Для этого существуют две основные операции: to и via. Первый позволяет подключить либо Source, либо Flow к Sink, а последний позволяет подключить Source или Flow к a Flow:

source.to(sink)   ->  runnable graph
flow.to(sink)     ->  sink

source.via(flow)  ->  source
flow1.via(flow2)  ->  flow

Для справки, runnable graph - полностью связанный реактивный поток, который готов к материализации и выполнению.

*Mat версии различных операций позволяют указать, как объединить материализованные значения потоков, включенных в операцию. Как вы знаете, каждый поток имеет материализованное значение, которое может быть получено, когда поток материализуется. Например, Source.queue дает объект очереди, который может использоваться другой частью вашей программы для извлечения элементов в бегущий поток.

По умолчанию to и via для источников и потоков только сохраняет материализованное значение потока, на которое он вызывается, игнорируя материализованное значение его аргумента:

source.to(sink)    yields   mat.value of source
source.via(flow)   yields   mat.value of source

flow.to(sink)      yields   mat.value of flow
flow1.via(flow2)   yields   mat.value of flow1

Иногда, однако, вам нужно как-то сохранить как материализованные ценности, так и объединить их. Это, когда нужны Mat варианты методов. Они позволяют указать функцию объединения, которая принимает материализованные значения обоих операндов и возвращает материализованное значение объединенного потока:

source.to(sink)    equivalent to   source.toMat(sink)(Keep.left)
flow1.via(flow2)   equivalent to   flow1.viaMat(flow2)(Keep.left)

Например, чтобы сохранить как материализованные значения, вы можете использовать метод Keep.both, либо вам нужно только значение mat.value "правого" операнда, вы можете использовать метод Keep.right:

source.toMat(sink)(Keep.both)   yields   a tuple (mat.value of source, mat.value of sink)