Scala Akka Stream:解压和广播有什么区别?
我正在努力实现这样的目标: 我正在尝试使用Scala Akka Stream:解压和广播有什么区别?,scala,stream,akka,akka-stream,Scala,Stream,Akka,Akka Stream,我正在努力实现这样的目标: 我正在尝试使用flow.fromGraph 我可以使用Zip[B,C]进行join,它接收两个流 我可以通过两种方式进行split: 使用广播[A](2) 使用解压[(A,A)],前面加.map(A->(A,A)) map(f1)和map(f2)都是我从包含的库中获取的自定义流,因此我无法真正修改它们,所以请不要说.map(a=>(f1(a),f2(a)) 这两种情况之间的区别是什么,或者是等效的?我发现唯一不同的是广播只有在所有下游取消时才能取消(急切取消
flow.fromGraph
- 我可以使用
进行Zip[B,C]
,它接收两个流join
- 我可以通过两种方式进行
:split
- 使用
广播[A](2)
- 使用
,前面加解压[(A,A)]
.map(A->(A,A))
- 使用
map(f1)
和map(f2)
都是我从包含的库中获取的自定义流,因此我无法真正修改它们,所以请不要说.map(a=>(f1(a),f2(a))
这两种情况之间的区别是什么,或者是等效的?我发现唯一不同的是广播只有在所有下游取消时才能取消(急切取消=false
),这是它的默认行为,而解压(广播使用急切取消=true
)时才能取消
另外,如果两条路径中的任何一条发生故障,会发生什么情况?i、 e.对于特定元素,如果f1抛出错误,会产生什么影响
另外,假设我们没有f2
函数(因此没有映射操作),并且我们希望在最后发出(b,a)
,那么f2应该被标识流替换,还是可以一起跳过?(如果是后者,您会使用身份流吗?)
可能这有助于内部缓冲/背压?可能FlowWithContext在这里有帮助,但目前它仍处于开发阶段,还没有充分准备好处理此问题。。。此外,FlowWithContext的文档/示例也不多,如下所示:
val split = builder.add(BroadCast[A](2))
val join = builder.add(Zip[B, A])
val F1: Flow[A, B, NotUsed] = Flow[A].map(f1)
val I = Flow[A].map(identity)
split ~> F1 ~> join.in1
split ~> /* I ~> */ join.in0 // do i need the commented part?