Akka Streams:具有自定义逻辑的扇出运算符

时间:2019-05-15 14:28:46

标签: akka-stream

我正在寻找一个Akka Streams运算符,该运算符将允许我根据自定义逻辑拆分流。我期望的消息集是预先已知的,因此无需动态扩展下游使用者。

在该库的早期版本中-仍被标记为实验性时-有一个FlexiRoute运算符。我看到它在某个时候积累了很多残留物,随后被取而代之的是GraphStage

如今,像BalancePartition这样的运算符已接近我的需求。 Balance要求我为每个使用者重复逻辑。 Partition仅适用于两个输出,我需要N。我可以通过每种消息类型使用Partition来实现,但这似乎很麻烦。

构建自定义解决方案是唯一的方法吗?

1 个答案:

答案 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)