确保扇入的元素属于扇出的相同元素

时间:2019-04-30 07:23:56

标签: scala akka akka-stream

假设我们有一个如下图所示的图形:

          broadcast ~> flowA ~> fanIn
source ~> broadcast ~> flowB ~> fanIn ~> sink
          broadcast ~> flowC ~> fanIn

flowAflowBflowC都对传入元素进行转换。 fanIn对所有三个流的结果执行一些合并操作。

挑战在于,A / B / C流不会以相同的速率发射元素。对于源中的某些元素,flowA没有要发射的东西,而flowBC则继续发射。

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

人们会怎么做呢?

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

1 个答案:

答案 0 :(得分:2)

返回无,将不会真正创建新对象…… 换成Some(而不是将执行nullcheck的Option)也可以提高性能。 我认为没有null元素就无法真正绕过,但是如果您的返回类型中包含nonValid / null,也可以用作None。 (例如,如果它们是具有长id的对象,则可以使用id = -1元素创建一个无效元素并将其过滤掉。) 我认为这里不会有银弹。

但是:我认为这不是问题,您不会失去明显的性能,您的代码可能还会有其他更大的瓶颈,所以放手:D

(从lightbend discuss转发了我的答案)