确保扇入的元素属于相同的扇出元素
Make sure elements fanned-in belong to same element fanned-out
假设我们有一个如下所示的图表:
broadcast ~> flowA ~> fanIn
source ~> broadcast ~> flowB ~> fanIn ~> sink
broadcast ~> flowC ~> fanIn
流 flowA
、flowB
、flowC
都对传入元素执行转换。 fanIn
对所有三个流的结果执行一些组合操作。
挑战在于流 A
/B
/C
不会以相同的速率发出元素。对于源的某些元素,flowA
没有任何发射,而 flowB
和 C
继续发射。
现在,在 fanIn
我想确保所有三个端口 "belong" 上接收到的元素都是从源发出的相同元素,即它们是相同的元素。
怎么办?
我目前的解决方案是让 Flows A
/B
/C
发出 Option
s。如果每个流可以执行转换,则发出 Some
,如果不能,则发出 None
。这样所有三个流的发射元素数量和速率保持不变,我可以保证接收到的元素属于同一个源元素。我正在寻找性能更好的解决方案,如果可能的话,不需要不必要的对象创建和包装。
返回一个None,并不会真正创建一个新对象...
包装到 Some(而不是将执行 nullcheck 的 Option)也可以提高性能。
我认为没有 null 元素你不能真正绕过,但是如果你的 return 类型中有一个 nonValid/null 也可以用作 None。 (例如,如果它们是具有长 id 的对象,您可以使用 id=-1 元素创建一个无效元素并将其过滤掉。)
我认为这里不会有灵丹妙药。
但是:我认为这不是问题,你不会损失显着的性能,你的代码可能会有其他更大的瓶颈,所以随它去吧:D
(从 lightbend discuss 转发了我的回答)
假设我们有一个如下所示的图表:
broadcast ~> flowA ~> fanIn
source ~> broadcast ~> flowB ~> fanIn ~> sink
broadcast ~> flowC ~> fanIn
流 flowA
、flowB
、flowC
都对传入元素执行转换。 fanIn
对所有三个流的结果执行一些组合操作。
挑战在于流 A
/B
/C
不会以相同的速率发出元素。对于源的某些元素,flowA
没有任何发射,而 flowB
和 C
继续发射。
现在,在 fanIn
我想确保所有三个端口 "belong" 上接收到的元素都是从源发出的相同元素,即它们是相同的元素。
怎么办?
我目前的解决方案是让 Flows A
/B
/C
发出 Option
s。如果每个流可以执行转换,则发出 Some
,如果不能,则发出 None
。这样所有三个流的发射元素数量和速率保持不变,我可以保证接收到的元素属于同一个源元素。我正在寻找性能更好的解决方案,如果可能的话,不需要不必要的对象创建和包装。
返回一个None,并不会真正创建一个新对象... 包装到 Some(而不是将执行 nullcheck 的 Option)也可以提高性能。 我认为没有 null 元素你不能真正绕过,但是如果你的 return 类型中有一个 nonValid/null 也可以用作 None。 (例如,如果它们是具有长 id 的对象,您可以使用 id=-1 元素创建一个无效元素并将其过滤掉。) 我认为这里不会有灵丹妙药。
但是:我认为这不是问题,你不会损失显着的性能,你的代码可能会有其他更大的瓶颈,所以随它去吧:D
(从 lightbend discuss 转发了我的回答)