我有两个容量变化很大的主题(可能是在左侧主题中为右侧主题中的每个事件发出1000个事件(。
我正试图将这两个主题leftJoin
放在一起,我的印象是,连接窗口是在处理时间而不是摄取时间内计算的,这会导致较小的流过早地"用完"。
是否可以指定流连接到摄取时间(或事件时间(的时间语义?
我可以理解为什么使用摄取时间不是一件容易的事情,但在处理历史流时,这似乎是必要的。
Kafka Streams的加入是基于事件时间的,即TimestampExtractor
返回的任何内容(默认情况下是存储在主题中的消息时间戳(,您不能修改它(只能使用不同的时间戳提取器来间接修改结果(。
不过,请注意,联接是"急切地"执行的,因此对于所有左侧记录,会立即查找右侧流,这可能会导致额外的<key, (left-value,null)>
结果。
它还取决于以尽力而为的方式基于事件时间的处理顺序。在2.3
版本中,保证得到了改进,使用配置参数max.task.idle.ms
可能有助于缓解此问题。
它在中期路线图上改进左联接和外联接行为,以避免那些额外的结果记录。由于Kafka是一个开源项目,你想学习它,请帮助尽快解决这个问题:(
唯一的其他替代方案是通过处理器API实现自定义的联接运算符。