【问题标题】:Why does an Akka stream has exactly one source and sink?为什么 Akka 流只有一个源和汇?
【发布时间】:2023-12-19 08:21:01
【问题描述】:

Akka Streams 文档明确指出,要使流可运行,它必须有恰好一个源和恰好一个接收器。我想知道是什么强加了这种约束。将多个源合并为一个从单个流分叉的多个接收器的场景都是非常合理的。是否有任何技术原因支持这种限制?

【问题讨论】:

  • 在这种情况下无法实现背压是我想到的原因之一。

标签: akka akka-stream reactive-streams


【解决方案1】:

我假设您参考了 this 文档部分,该部分定义了 Akka Streams 的基本组件:

来源:只有一个输出的处理阶段,[...]

接收器:只有一个输入的处理阶段,[...]

流程:只有一个输入和输出的处理阶段,[...]

RunnableGraph:两端分别“连接”到 Source 和 Sink 的 Flow,并准备好成为 run()

虽然前 3 个定义清晰而真实,但我认为 RunnableGraph 的定义是不完整的。 RunnableGraph 可以按照描述的方式定义(即source.via(flow).to(sink)),这是获得其中之一的最简单方法。但是,还有更灵活和复杂的方式来定义RunnableGraphs,例如GraphDSL

如果您查看this 部分中的示例,您会看到RunnableGraphs 由多个源和/或多个接收器构建而成。

更准确地说,RunnableGraph 是一个没有输入也没有输出的处理阶段(即有一个ClosedShape)。

【讨论】:

  • 感谢您的解释。是的,我指的是这些定义,它是将 RunnableGraph 定义为通过流将单个源连接到单个接收器的图,这让我感到困惑。现在很清楚了。