Hazelcast Jet:如何预防';事件已删除';?

Hazelcast Jet:如何预防';事件已删除';?,hazelcast,hazelcast-jet,Hazelcast,Hazelcast Jet,我被“事件取消,晚了5051毫秒” 我应该如何构建处理所有事件的管道,而不考虑它们的延迟到达 我试过几种方法。基本上,我尝试的是 没有窗口,我没有得到延迟事件,但这不适用于我,因为并行执行和sink中的值被覆盖而不是合并 因此,我使用了windowing解决了我的覆盖问题,但导致了延迟事件 接下来,我尝试使用不带时间戳的窗口,这引发了必须定义时间戳的异常 基本上我这里有两个问题:1)如何将新事件合并到接收器中的现有事件2)而不删除事件或重写 代码: WindowDefinition custom

我被“事件取消,晚了5051毫秒”

我应该如何构建处理所有事件的管道,而不考虑它们的延迟到达

我试过几种方法。基本上,我尝试的是

  • 没有窗口,我没有得到延迟事件,但这不适用于我,因为并行执行和sink中的值被覆盖而不是合并
  • 因此,我使用了windowing解决了我的覆盖问题,但导致了延迟事件
  • 接下来,我尝试使用不带时间戳的窗口,这引发了必须定义时间戳的异常 基本上我这里有两个问题:1)如何将新事件合并到接收器中的现有事件2)而不删除事件或重写

    代码:

    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(...)