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)
);
预期结果解释如下:
- 点击事件在查看后 1 秒到达 - 加入事件 (A,A)
- 点击事件在查看后 11 秒到达 - 每个事件都有不同的事件。每个到达 2 秒后(Window 大小)。(B,null) (null,B)
- 一个视图事件在点击后 1 秒到达 - 加入的事件(C,C)
- 有查看事件但没有点击 - 到达 2 秒后未加入事件(D,null)
- 有点击事件但没有观看 - 到达 2 秒后未加入事件 (null,E)
Atm (Kafka 2.7.0) 的行为如博客 post 中所述。这个问题已经多次出现,我们最近创建了一个票证来改变行为:https://issues.apache.org/jira/browse/KAFKA-10847
Atm,您可以在加入后使用下游有状态操作,以缓冲记录直到 window 结束(或者更好,window 关闭,即 window 结束加上宽限期)已到。这允许您过滤掉虚假的 left/outer 连接结果。
如综合文章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)
);
预期结果解释如下:
- 点击事件在查看后 1 秒到达 - 加入事件 (A,A)
- 点击事件在查看后 11 秒到达 - 每个事件都有不同的事件。每个到达 2 秒后(Window 大小)。(B,null) (null,B)
- 一个视图事件在点击后 1 秒到达 - 加入的事件(C,C)
- 有查看事件但没有点击 - 到达 2 秒后未加入事件(D,null)
- 有点击事件但没有观看 - 到达 2 秒后未加入事件 (null,E)
Atm (Kafka 2.7.0) 的行为如博客 post 中所述。这个问题已经多次出现,我们最近创建了一个票证来改变行为:https://issues.apache.org/jira/browse/KAFKA-10847
Atm,您可以在加入后使用下游有状态操作,以缓冲记录直到 window 结束(或者更好,window 关闭,即 window 结束加上宽限期)已到。这允许您过滤掉虚假的 left/outer 连接结果。