Как подписаться на реализацию реактивных потоков, работающую на другой JVM?

Предположим, у нас есть два потока Akka Stream, каждый из которых работает на собственной JVM.

// A reactive streams publisher running on JVM 1:
val stringPublisher: Publisher[String] = Source(() => "Lorem Ipsum".split("\\s").iterator).runWith(Sink.publisher[String])

// A reactive streams subscriber running on JVM 2:
def subscriber: Subscriber[String] = Sink.foreach[String](println(_)).runWith(Source.subscriber[String])

// Subscribe the second stream to the first stream
stringPublisher.subscribe(subscriber)

Этот пример отлично работает на одной JVM, но как я могу подписаться на издателя, работающего на другой JVM?

Должен ли я использовать промежуточное программное обеспечение для обмена сообщениями/очередями или я могу использовать API реактивных потоков, чтобы соединить их вместе?


person Ruurtjan Pul    schedule 06.03.2015    source источник
comment
на первый взгляд, я бы сказал, что вам понадобится обмен сообщениями или RPC, поскольку каждая JVM работает в своей собственной песочнице.   -  person Nikos M.    schedule 06.03.2015
comment
Хороший вопрос... Я также рассуждаю о распределенных реактивных потоках. Базовым механизмом является Akka, и Akka масштабируется на разные машины. Но я не уверен, что Akka-Stream поддерживает это из коробки...   -  person Peti    schedule 19.04.2015


Ответы (1)


Спецификация reactive-streams не говорит о распределенных (межсетевых) потоках, и ни в одной из ее текущих реализаций ( Например, Akka Streams) реализуют потоки, пересекающие границы сети. Это немного сложно сделать (но можно сделать и, возможно, так и будет), поскольку требуется прозрачная повторная доставка в случае потери сообщения.

Краткий ответ: вы (в настоящее время) не можете. Однако, поскольку Akka HTTP основан на потоке и применяет обратное давление через TCP, вы можете подключать потоки через потоковый протокол TCP или HTTP, и обратное давление будет работать как положено.

person Konrad 'ktoso' Malawski    schedule 07.06.2015