Hazelcast Jet:如何预防';事件已删除';?
我被“事件取消,晚了5051毫秒” 我应该如何构建处理所有事件的管道,而不考虑它们的延迟到达 我试过几种方法。基本上,我尝试的是Hazelcast Jet:如何预防';事件已删除';?,hazelcast,hazelcast-jet,Hazelcast,Hazelcast Jet,我被“事件取消,晚了5051毫秒” 我应该如何构建处理所有事件的管道,而不考虑它们的延迟到达 我试过几种方法。基本上,我尝试的是 没有窗口,我没有得到延迟事件,但这不适用于我,因为并行执行和sink中的值被覆盖而不是合并 因此,我使用了windowing解决了我的覆盖问题,但导致了延迟事件 接下来,我尝试使用不带时间戳的窗口,这引发了必须定义时间戳的异常 基本上我这里有两个问题:1)如何将新事件合并到接收器中的现有事件2)而不删除事件或重写 代码: WindowDefinition custom
WindowDefinition customWindow=WindowDefinition.slideing(600030000);
customWindow.setEarlyResultsPeriod(1000);
StreamStage updatedState=p
.从()中提取
.withIngestionTimestamps()
.groupingKey(…)
.窗口(自定义窗口)
.aggregate(AggregateOperations.toCollection(ArrayList::new))
.MapUsingMap(…)
.水槽(…)
您可以共享您的管道吗?您的数据源是什么?当您添加时间戳时,您可以配置一个延迟,该延迟应该决定您可以容忍的延迟事件的数量。我的数据源是Hazelcast IMap。我没有添加任何特殊的时间戳。我只是用了摄入时间戳。如果我使用滞后,问题是,我以后会得到结果,因为它需要等待,也需要滞后时间,对吗?这对我来说是不可接受的。我最多可以等待1-2秒。对于合并结果,您可以使用Sinks.mapWithUpdate
。您可以将滞后时间设置为1到2秒,但如果您的事件延迟5秒,那么它们将被删除。您可以使用早期结果更早地获得结果。因为您使用的是摄取时间戳,所以看到延迟事件确实令人惊讶。在这种情况下,Jet甚至不允许您配置允许的事件延迟。您没有指定“事件合并”的含义,但您应该能够使用Sinks.mapWithMerging
或Sinks.mapWithUpdate
并在那里实施合并策略。是的,我知道Sinks.mapWithMerging
和Sinks.mapWithUpdate
。谢谢你的建议。我的管道实际上在合并后分裂。一个分支继续更新值,而另一个分支将值存储回接收器。为了简单起见,我省略了那部分。但是是的,我同意在摄入时间戳上看到延迟事件是令人惊讶的。上面说晚了10秒甚至更多。因此,我将尝试使用1分钟的延迟和早期结果。您能否共享您的管道,您的数据源是什么?当您添加时间戳时,您可以配置一个延迟,该延迟应该决定您可以容忍的延迟事件的数量。我的数据源是Hazelcast IMap。我没有添加任何特殊的时间戳。我只是用了摄入时间戳。如果我使用滞后,问题是,我以后会得到结果,因为它需要等待,也需要滞后时间,对吗?这对我来说是不可接受的。我最多可以等待1-2秒。对于合并结果,您可以使用Sinks.mapWithUpdate
。您可以将滞后时间设置为1到2秒,但如果您的事件延迟5秒,那么它们将被删除。您可以使用早期结果更早地获得结果。因为您使用的是摄取时间戳,所以看到延迟事件确实令人惊讶。在这种情况下,Jet甚至不允许您配置允许的事件延迟。您没有指定“事件合并”的含义,但您应该能够使用Sinks.mapWithMerging
或Sinks.mapWithUpdate
并在那里实施合并策略。是的,我知道Sinks.mapWithMerging
和Sinks.mapWithUpdate
。谢谢你的建议。我的管道实际上在合并后分裂。一个分支继续更新值,而另一个分支将值存储回接收器。为了简单起见,我省略了那部分。但是是的,我同意在摄入时间戳上看到延迟事件是令人惊讶的。上面说晚了10秒甚至更多。因此,我将尝试使用1分钟的延迟和早期结果。
WindowDefinition customWindow = WindowDefinition.sliding(60000, 30000);
customWindow.setEarlyResultsPeriod(1000);
StreamStage<Map.Entry<...>> updatedState = p
.drawFrom(<source>)
.withIngestionTimestamps()
.groupingKey(...)
.window(customWindow)
.aggregate(AggregateOperations.toCollection(ArrayList::new))
.mapUsingIMap(...)
.sink(...)