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

Make sure elements fanned-in belong to same element fanned-out

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

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

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

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

现在,在 fanIn 我想确保所有三个端口 "belong" 上接收到的元素都是从源发出的相同元素,即它们是相同的元素。

怎么办?

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

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

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

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