Akka Streams - Понимание того, когда и как работает материализация - PullRequest
0 голосов
/ 24 апреля 2018

Приложение, которое я разрабатываю, требует / дает пользователям возможность создавать и определять произвольные потоки во время выполнения. Я так понимаю, что в потоках Акки в частности

Материализация = Выполнить или Выполнить

Мои вопросы

1) Должна ли материализация потока выполняться только один раз? т.е. если он уже материализован, могу ли я использовать значение для последующих прогонов?

2) Как сказано выше, возможно, я неправильно понял термин материализация. Если поток должен работать, он материализуется каждый раз?

Я в замешательстве, потому что в документах говорится, что материализация на самом деле создает ресурсы, необходимые для выполнения потока. Поэтому я сразу понимаю, что это должно быть сделано только один раз. Точно так же, как соединение JDBC с базой данных. Может кто-нибудь объяснить, пожалуйста, в терминологии не-akka.

1 Ответ

0 голосов
/ 24 апреля 2018

Да, поток может материализоваться несколько раз. И да, если поток запускается несколько раз, он материализуется каждый раз. Из документации :

Поскольку поток может быть материализован несколько раз, материализованное значение также будет рассчитываться заново для каждой такой материализации, что обычно приводит к тому, что каждый раз возвращаются разные значения. В приведенном ниже примере мы создаем два запущенных материализованных экземпляра потока, которые мы описали в переменной runnable, и обе материализации дают нам отличное Future от карты, даже если мы использовали один и тот же sink для ссылки на будущее. :

// connect the Source to the Sink, obtaining a RunnableGraph
val sink = Sink.fold[Int, Int](0)(_ + _)

val runnable: RunnableGraph[Future[Int]] =
  Source(1 to 10).toMat(sink)(Keep.right)

// get the materialized value of the FoldSink
val sum1: Future[Int] = runnable.run()
val sum2: Future[Int] = runnable.run()

// sum1 and sum2 are different Futures!

Думайте о потоке как о многоразовой схеме, которую можно запускать / материализовать несколько раз. Материализатор необходим для материализации потока, и Akka Streams предоставляет материализатор под названием ActorMaterializer. Материализатор распределяет необходимые ресурсы (актеры и т. Д.) И выполняет поток. Хотя обычно используется один и тот же материализатор для разных потоков и нескольких материализаций, каждая материализация потока запускает распределение ресурсов, необходимое для запуска потока. В приведенном выше примере sum1 и sum2 используют один и тот же проект (runnable) и один и тот же материализатор, но они являются результатами различных материализаций, которые привели к разным распределениям ресурсов.

...