Scala 确保扇出的图元与扇出的图元属于同一图元

Scala 确保扇出的图元与扇出的图元属于同一图元,scala,akka,akka-stream,Scala,Akka,Akka Stream,假设我们有一个如下图: broadcast ~> flowA ~> fanIn source ~> broadcast ~> flowB ~> fanIn ~> sink broadcast ~> flowC ~> fanIn 流flowA,flowB,flowC都对传入元素执行转换fanIn对所有三个流的结果执行一些组合操作 挑战在于流A/B/C不以相同的速率发射元素。对于源的某些元素,flowA无需发射

假设我们有一个如下图:

          broadcast ~> flowA ~> fanIn
source ~> broadcast ~> flowB ~> fanIn ~> sink
          broadcast ~> flowC ~> fanIn
flowA
flowB
flowC
都对传入元素执行转换
fanIn
对所有三个流的结果执行一些组合操作

挑战在于流
A
/
B
/
C
不以相同的速率发射元素。对于源的某些元素,
flowA
无需发射,而
flowB
C
继续发射

现在,在
fanIn
上,我想确保所有三个端口上接收的元素“属于”从源发出的相同元素,即它们是相同元素转换的结果

这件事怎么办


我当前的解决方案是使用流
A
/
B
/
C
emit
选项
s。如果每个流能够执行转换,则会发出
Some
,如果不能执行转换,则会发出
None
。这样,所有三个流上发出的元素数量和速率保持不变,并且我可以保证收到的元素属于同一个源元素。我正在寻找一种性能更好的解决方案,如果可能的话,它不需要不必要的对象创建和包装。

返回“无”,将不会真正创建新对象… 将包装为Some(而不是执行空检查的选项)也可以提高性能。 我认为如果没有null元素,就不能真正绕过它,但是如果在返回类型中有一个nonValid/null,它也可以用作None。(对于ex,如果它们是具有长id的对象,则可以创建id=-1元素的无效元素并将其过滤掉。) 我想这里不会有银弹

但是:我认为这不是一个问题,您不会损失显著的性能,您的代码可能会有其他更大的瓶颈,所以让它去吧:D


(从中转发了我的答案)

返回“无”,将不会真正创建新对象… 将包装为Some(而不是执行空检查的选项)也可以提高性能。 我认为如果没有null元素,就不能真正绕过它,但是如果在返回类型中有一个nonValid/null,它也可以用作None。(对于ex,如果它们是具有长id的对象,则可以创建id=-1元素的无效元素并将其过滤掉。) 我想这里不会有银弹

但是:我认为这不是一个问题,您不会损失显著的性能,您的代码可能会有其他更大的瓶颈,所以让它去吧:D


(从中转载了我的答案)

使用
None
s在实践中证明是最实际的。有一个额外的输出端口作为信号发射
Unit
s也是我尝试过的,但结果是有问题的,而且并不优于
None
s,因为发射
None
s并不是在创建新对象。使用
None
s在实践中证明是最实用的。有一个额外的输出端口作为信号发射
Unit
s也是我尝试过的,但结果是有问题的,而且并不优于
None
s,因为发射
None
s并不创建新对象。