Akka Streams - понимание того, когда и как работает материализация

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

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

Мои вопросы

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

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

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


person Wang Liqin    schedule 24.04.2018    source источник


Ответы (1)


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

Поскольку поток может быть материализован несколько раз, материализованное значение также будет вычисляться заново для каждой такой материализации, что обычно приводит к возвращению разных значений каждый раз. В приведенном ниже примере мы создаем два запущенных материализованных экземпляра потока, которые мы описали в переменной 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) и один и тот же материализатор, но они являются результатами различных материализаций, в результате которых были выделены разные ресурсы.

person Jeffrey Chung    schedule 24.04.2018
comment
Большое спасибо за объяснение. Но я сбит с толку, потому что создание акторов стоит дорого, и если материализация происходит каждый раз при запуске потока, не будет ли это дорого? Насколько я понимаю, потоки используют один субъект внизу для последовательных компонентов и выделенных субъектов для асинхронных компонентов. Или это что-то, о чем позаботилась среда выполнения, и нам не нужно беспокоиться о части производительности. - person Wang Liqin; 24.04.2018
comment
Объединение операторов - поведение по умолчанию. Будет ли работать лучше слияние операторов или определение асинхронных границ, зависит от ситуации. Это сообщение в блоге помогает понять значение обоих подходов. - person Jeffrey Chung; 24.04.2018
comment
@JeffreyChung Меня немного смущает то, что вы имеете в виду, поскольку в обоих случаях sum1 и sum2 разные фьючерсы. Разве они не обладают одинаковой ценностью? - person alt-f4; 02.07.2020