Akka Stream:在图形构建阶段动态增长出口

时间:2016-05-13 19:16:51

标签: scala akka-stream

据我所知,在Akka Stream中,一个插座必须连接到一个插座,并且没有自动支持将多个插槽连接到同一个插座。因此,您必须插入Broadcast等中间对象。

我正在将信号处理DAG转换为Akka Stream图,如果我可以在遍历中发现它们时动态地向源添加接收器,那将对我有所帮助。如果我有自定义GraphStage,我可以拥有自己的Shape outlets集合在Graph.create阶段动态增长吗?正常的DSL操作~>由此调用支持:

b.addEdge(importAndGetPort(b), to)

建造者如何在这里“获得”Outlet并且能够按需增加我的形状?

如果这不起作用,是否可以“弹出”前一个广播,断开其边缘并在图形构建期间用新的更大的广播连接它们?

1 个答案:

答案 0 :(得分:2)

GraphDSL不允许动态改变您的形状。

但是,从Akka 2.4.10开始,您可以使用BroadcastHub(和MergeHub)。

BroadcastHub可以为您提供一个实现源的接收器。 此源可以根据需要多次实现,以动态连接多个订户。

因此,对于DAG的节点(例如,具有indegree = 1和outdegree = 3),您可以使用

val hubSource = inEdgeSource.toMat(BroadcastHub.sink(bufferSize = ...))(Keep.right).run()

val nodeSink1 = hubSource.to(outEdgeSink1).run()
val nodeSink2 = hubSource.to(outEdgeSink2).run()
val nodeSink3 = hubSource.to(outEdgeSink3).run()

Akka docs:

http://doc.akka.io/docs/akka/2.4/scala/stream/stream-dynamic.html#Dynamic_fan-in_and_fan-out_with_MergeHub_and_BroadcastHub

相关问题