是否可以有条件地暂停和恢复卡夫卡流?



如前所述@ https://kafka.apache.org/21/documentation/streams/developer-guide/dsl-api.html#window-final-results,我有一个要求,即等到窗口关闭,以便通过在窗口持续时间内缓冲来处理延迟的乱序事件。

根据我对此功能的理解,一旦创建了窗口,窗口的工作方式就像挂钟处理一样,例如创建 1 小时窗口,一旦第一个事件到来,窗口就会开始滴答作响。此 1 小时窗口在一小时后关闭,到目前为止缓冲的所有事件都将转发到下游。但是,我需要能够根据需要有条件地保持此窗口更长的时间,例如基于外部系统(如数据库)中的状态/信息。

确切地说,我对事件转发的要求是(如果外部状态记录说它很好,则窗口为 1 小时)或(根据需要保持,直到外部记录说它很好并恢复对事件的跟踪,直到事件达到整整 1 小时,忽略外部系统不好的时间) 详细说明第二个条件,例如,如果我的窗口持续时间为 1 1 小时,我的事件从 00:00 开始,如果在 00:30 下降并在 00:45 恢复正常,则窗口应延长到 01:15。

是否可以根据我的上述要求有条件地暂停和恢复事件的转发? 我是否必须使用转换/处理器并手动使用值存储来跟踪事件的首次处理时间并在标点符号中有条件地转发缓冲事件?

我感谢针对此要求的各种解决方法和建议。

窗口的工作方式类似于挂钟处理

不。Kafka 流在事件时间上工作,因此,从TimestampExtractor返回的时间戳(默认情况下是嵌入式记录时间戳)用于推进时间。

确切地说,我对事件转发的要求是(如果外部状态记录说它很好,则窗口为 1 小时)

恕我直言,这将需要一个自定义解决方案。

或者(根据需要保持,直到外部

记录显示它很好,并恢复对事件的跟踪,直到事件完全 1 小时,忽略外部系统不好的时间)

如果我理解这部分,不是 100%。

是否可以根据我的上述要求有条件地暂停和恢复事件的转发?

不。

我是否必须使用转换/处理器并手动使用值存储来跟踪事件的首次处理时间并在标点符号中有条件地转发缓冲事件?

我认为这可能是必需的。

查看这篇博客文章,其中详细解释了suppress()如何工作,以及它何时根据观察到的事件时间发出:https://www.confluent.io/blog/kafka-streams-take-on-watermarks-and-triggers

最新更新