kafka 流如何计算水印?

How does kafka streams compute watermarks?

Kafka Streams 是否在内部计算水印?是否可以在 window 完成时(即当水印通过 window 的末尾时)(仅)观察结果?

Kafka Streams 内部不使用水印,但 2.1.0 中的一项新功能可让您在关闭时观察 window 的结果。它叫做 Suppressed,您可以在文档中阅读它:Window Final Results:

KGroupedStream<UserId, Event> grouped = ...;
grouped
    .windowedBy(TimeWindows.of(Duration.ofHours(1)).grace(ofMinutes(10)))
    .count()
    .suppress(Suppressed.untilWindowCloses(unbounded()))

Does Kafka Streams internally compute watermarks?

没有。 Kafka Streams 遵循不需要水印的持续更新处理模型。您可以在线找到有关此内容的更多详细信息:

Is it possible to observe the result of a window (only) when it completes (i.e. when watermark passes end of window)?

您可以随时观察 window 的结果。通过例如 KTable#toStream()#foreach()(即基于推送的方法)订阅结果变更日志流,或者通过 Interactive Queries 让您主动查询结果 window(即基于拉取的方法)方法)。

如@Dmitry 所述,对于基于推送的方法,如果您只对 window 的最终结果感兴趣,也可以使用 suppress() 运算符。