【问题标题】:Kafka Streams: Handle Aging of events in a stream on window expiryKafka Streams:在窗口到期时处理流中的事件老化
【发布时间】:2020-01-28 05:09:44
【问题描述】:

我目前正在使用 kafka 流来整理窗口内的相关事件。如果所有相关事件都没有在一个窗口内到达,那么 Kafka 流中是否有一种方法可以让我们获得过期事件的句柄。这将有助于处理/通知下游应用程序所有相关事件都没有到达进行排序。感谢您的回复。
以下是示例
示例 1:
- 组 ID:g1
- 活动到达:E1,10am; E2 上午 10:01 和 E3 上午 10:02
- 窗口:不活动持续时间为 5 分钟的会话窗口。
- 结果:所有事件均已成功整理。

示例 2:
- 活动到达:E1,10am; E2 上午 10:01 和 E3 没有到达
- 窗口:不活动持续时间为 5 分钟的会话窗口。
- 结果:触发动作或通过监听器获得通知 E1 和 E2 上午 10:06 窗口到期时的整理

【问题讨论】:

  • 这个问题有点不清楚。您是在问“Kafka 流中是否有一种方法可以让我们处理过期事件?”
  • 是的,有没有办法获取窗口过期事件的句柄。

标签: apache-kafka-streams


【解决方案1】:

Kafka Streams 中的窗口“不会过期”,但会保持打开状态以允许处理迟到的数据。

比较How to send final kafka-streams aggregation result of a time windowed KTable?

无法注册任何回调,

  • 不适用于“流时间”提前并超过“窗口结束时间”的情况
  • 不适用于最终删除窗口的情况(即,保留期过后)

【讨论】:

  • 感谢马特的回复。是否有另一种方法可以通过 Kafka Streaming 库或通过交互式查询,我们在以下情况下识别事件:a)当窗口被丢弃时 b)当窗口时间已过时。
  • 你可以使用一个虚拟的transformValues,它只是转发它的传入数据并注册一个标点时间表——标点是基于内部跟踪的“流时间”,因此你可以确定时间是否超过了窗口-结束时间——如果您考虑保留时间,您还可以计算出最终丢弃窗口的时间。因此,您可以像这样通过 IQ 间接访问当前窗口内容——但它非常笨拙,也不是 100% 精确。
  • @mat Kafka Streams 中的窗口确实会在窗口的“过期”/定义的“直到”期间过去并且状态存储最终丢弃窗口时过期。因此,Windows 不会过期的想法是错误的。从所有关于此的 SO 问题和论坛主题中,我很清楚这是一个疏忽和缺失的功能。数据不会永远存在于会话存储中,我们想知道该值是什么以及何时过期。
  • 我将“不会过期”放在引号中——我的观点是,与使用触发器的其他系统相比,Kafka Streams 使用不同的模型。您当然是对的,不可能永远维护窗口并且我们应用保留时间。因此,从我的角度来看,删除窗口不是一等公民,因此没有暴露 API。即将知道值是什么:您立即获得最新更新,因此,您确实知道过期窗口的值。只是没有回电。此外,您可以根据进度推断窗口是否应该已过期...
  • 关于您的申请进度。窗口到期基于事件时间,因此您可以根据您可以在应用程序中访问的记录时间戳来估计窗口何时到期。当然,Apache Kafka 是一个开源项目,非常欢迎新特性的想法。 kafka.apache.org/contactissues.apache.org/jira/projects/KAFKA
【解决方案2】:

没有尝试过,但似乎窗口最终结果可能会这样做 https://kafka.apache.org/24/documentation/streams/developer-guide/dsl-api.html#window-final-results

这个想法是在窗口关闭时检查所有事件是否已经到达,如果不是这样,则触发一些操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多