Использует ли Akka Streams Akka Actors?

Я начал изучать потоки Akka, который представляет собой платформу для обработки данных с функцией обратного давления. Библиотека является частью Akka, которая описывает себя как:

Akka - это набор инструментов и среда выполнения для создания параллельных, распределенных и отказоустойчивых приложений, управляемых сообщениями, на JVM.

Эти возможности проистекают из природы актеров Akka. Однако, с моей точки зрения, потоковая обработка и акторы не имеют отношения друг к другу.

Вопрос: Используют ли Akka Streams эти особенности актеров Akka? Если да, не могли бы вы объяснить, как актеры помогают стримам?


person suztomo    schedule 31.07.2015    source источник


Ответы (2)


Akka Streams - это абстракция более высокого уровня, чем акторы. Это реализация реактивных потоков, которая строится поверх модели акторов. Он использует все особенности актеров, потому что использует актеров.

Вы даже можете вернуться к использованию актеров непосредственно в любой части потока. Посмотрите на ActorPublisher и ActorSubscriber.

person Quizzie    schedule 31.07.2015
comment
Спасибо. Я не заметил, что Akka Stream построен поверх актеров. Позвольте мне изучить два класса. Подберу ответ через несколько дней. - person suztomo; 31.07.2015
comment
Поток Akka flow определяет неизменяемую схему, а процесс, называемый материализация (с параметрами), запускает их как высоко параллельный, распределенный и устойчивый управляемый сообщениями поток поверх акторов Akka. . - person suztomo; 02.08.2015

Хорошей отправной точкой является Краткое руководство по аккастриму.

Да, Actor используется для "материализации" каждого {Source, Flow, Sink} из Stream. Это означает, что когда вы создаете поток, на самом деле ничего не происходит до тех пор, пока поток не материализуется, обычно через вызов метода .run().

В качестве примера, вот определяемый поток:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow, Sink}

val stream = Source.single[String]("test")
                   .via(Flow[String].filter(_.size > 0))
                   .to(Sink.foreach{println})

Несмотря на то, что поток теперь val, никаких вычислений на самом деле не произошло. Stream - это всего лишь рецепт для вычислений. Чтобы действительно начать работу, Stream должен быть материализован. Вот пример, в котором не используются имплициты, чтобы ясно показать, как происходит материализация:

val actorSystem = ActorSystem()
val materializer = ActorMaterializer()(actorSystem)

stream.run()(materializer)  //work begins

Теперь было создано 3 Актера (как минимум): 1 для Source.single, 1 для Flow.filter и 1 для Sink.foreach. Примечание: вы можете использовать тот же materializer для запуска других потоков

val doesNothingStream = Source.empty[String]
                              .to(Sink.ignore)
                              .run()(materializer)
person Ramón J Romero y Vigil    schedule 29.10.2015