KStream join 立即触发 join 功能,如何在 window 结束时延迟它?

KStream join fires join function instantly, how to delay it at the end of window?

如综合文章Crossing the Streams中所述。 Outer KStream-KStream Join 元素一到达就发出,甚至在等待另一个 K-Stream 中的匹配之前。这样做的缺点是它会复制未加入的事件以及每个加入的事件。

您能否建议任何替代方法来实现事件连接而不重复(如在外部连接中)或丢失(如在内部连接中)?


根据相同的点击查看事件示例

KStream<String, JsonNode> joinedEventsStream = 
     clickEventsStream.outerJoin(viewEventsStream,
            (clickEvent, viewEvent) -> processJoin(clickEvent, viewEvent),/* Fire quickly if match found,*/
                                                                          /* else fire after 2 seconds */
            JoinWindows.of(Duration.ofSeconds(2L)), StreamJoined.with(Serdes.String(), jsonSerde, jsonSerde)
    );

预期结果解释如下:

Atm (Kafka 2.7.0) 的行为如博客 post 中所述。这个问题已经多次出现,我们最近创建了一个票证来改变行为:https://issues.apache.org/jira/browse/KAFKA-10847

Atm,您可以在加入后使用下游有状态操作,以缓冲记录直到 window 结束(或者更好,window 关闭,即 window 结束加上宽限期)已到。这允许您过滤掉虚假的 left/outer 连接结果。