我正在寻找一个Akka Streams运算符,该运算符将允许我根据自定义逻辑拆分流。我期望的消息集是预先已知的,因此无需动态扩展下游使用者。
在该库的早期版本中-仍被标记为实验性时-有一个FlexiRoute
运算符。我看到它在某个时候积累了很多残留物,随后被取而代之的是GraphStage
。
如今,像Balance
和Partition
这样的运算符已接近我的需求。 Balance
要求我为每个使用者重复逻辑。 Partition
仅适用于两个输出,我需要N。我可以通过每种消息类型使用Partition
来实现,但这似乎很麻烦。
构建自定义解决方案是唯一的方法吗?
答案 0 :(得分:0)
分区是您所需要的。它适用于N个而不是仅2个输出。阅读API的https://doc.akka.io/api/akka/current/akka/stream/scaladsl/Partition.html,例如阅读https://blog.colinbreck.com/partitioning-akka-streams-to-maximize-throughput/#partition。
API文档的快照:
new Partition(outputPorts: Int, partitioner: (T) ⇒ Int, eagerCancel: Boolean)
示例快照:
val flow = Flow.fromGraph(GraphDSL.create() { implicit b =>
import GraphDSL.Implicits._
val workerCount = 4
val partition = b.add(Partition[Int](workerCount, _ % workerCount))
val merge = b.add(Merge[Int](workerCount))
for (_ <- 1 to workerCount) {
partition ~> Flow[Int].map(spin).async ~> merge
}
FlowShape(partition.in, merge.out)
})
Source(1 to 1000)
.via(flow)
.runWith(Sink.ignore)