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?