首页 > 解决方案 > 确保扇入元素属于同一个扇出元素

问题描述

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

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

Flows flowA, flowB,flowC都对传入的元素执行转换。fanIn对所有三个流程的结果执行一些组合操作。

挑战在于 Flows A//不会以相同的速率发射元素BC对于源的某些元素,flowA没有什么要发射的,同时flowBC继续发射。

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

怎么办?

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

标签: scalaakkaakka-stream

解决方案


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

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

(从lightbend 讨论转贴我的回答)


推荐阅读