据我所知,在Akka Stream中,一个插座必须连接到一个插座,并且没有自动支持将多个插槽连接到同一个插座。因此,您必须插入Broadcast
等中间对象。
我正在将信号处理DAG转换为Akka Stream图,如果我可以在遍历中发现它们时动态地向源添加接收器,那将对我有所帮助。如果我有自定义GraphStage
,我可以拥有自己的Shape
outlets
集合在Graph.create
阶段动态增长吗?正常的DSL操作~>
由此调用支持:
b.addEdge(importAndGetPort(b), to)
建造者如何在这里“获得”Outlet
并且能够按需增加我的形状?
如果这不起作用,是否可以“弹出”前一个广播,断开其边缘并在图形构建期间用新的更大的广播连接它们?
答案 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: