Я новичок в Akka Stream
и только на прошлой неделе начал читать его документы. Я могу понять большинство концепций, но мне трудно понять, что означает Materialized Value
в потоке Akka и каково его значение?
Если бы кто-нибудь мог объяснить мне это на примере из реального мира, это очень помогло бы связать его и его варианты использования в Akka Stream.
Обновить
Я просматривал приведенный ниже пример и хотел понять два разных типа вывода, которые мы получаем для одного и того же графика. Я знаю, что это имеет прямое отношение к Materialized Value
, и именно поэтому я задал вопрос выше.
implicit val system = ActorSystem("PlainSinkProducerMain")
implicit val materializer = ActorMaterializer()
val source = Source(1 to 10)
val sink = Sink.fold[Int, Int](0)(_ + _)
val runnable: RunnableGraph[Future[Int]] =
source.toMat(sink)(Keep.right)
val sum1: Future[Int] = runnable.run()
val sum2: Future[Int] = runnable.run()
println(sum1.value)
println(sum2.value)
Когда я запускаю это, я получаю вывод ниже:
None
Some(Success(55))
Приведенный выше пример взят из документов. и ниже пояснение к этому.
Поскольку поток может материализоваться несколько раз, материализованное значение также будет вычисляться заново для каждой такой материализации, что обычно приводит к тому, что каждый раз возвращаются разные значения. В приведенном ниже примере мы создаем два работающих материализованных экземпляра потока, которые мы описали в переменной runnable, и обе материализации дают нам будущее, отличное от карты, даже несмотря на то, что мы использовали один и тот же приемник для ссылки на будущее.
У меня есть 2 вопроса: 1) Почему 2 разных материализованных экземпляра одного и того же графа имеют 2 разных выходных значения? Хотя материализованное значение вычисляется дважды, но под капотом оба расчета относятся к одному и тому же графику.
2) Почему тип возврата Some(Success(55))
вместо обычного 55
для успешного выполнения и Failure Exception
для неудачных случаев? (Это могут быть глупые вопросы, но я хочу понять, какую проблему/преимущество решает/дает это специальное возвращаемое значение.)
Future[Int]
говорит, что материализация графа даст целочисленное значение в будущем, если оно завершится успешно, или выдаст сообщение об ошибке. Я хочу знать, что послужило мотивом для этого дизайна? и почему простое сообщение об успехе и неудаче не было выброшено? Это потому, что он работаетAsynchronously
, а другая задача будет использовать значениеFuture[Int]
, чтобы определить, произошла ли какая-либо ошибка или нет в определенный момент времени «T»? - person Explorer   schedule 03.08.2017Therefore, even if the stream terminates immediately, it is not guaranteed that the value will be available immediately
эта строка объясняет причину наличияFuture[Int]
. Спасибо и за другие комментарии, которые очень помогли понять преимущества дизайна, которые дает Akka Stream. - person Explorer   schedule 03.08.2017