繁体   English   中英

Kafka Streams 控制流

[英]Kafka Streams Flow Of Control

我有一个关于 kafka 流应用程序中控制流的基本问题。 如果有两个源主题 A 和 B。假设 A 的记录的时间戳早于 B。流应用程序处理记录的顺序是否有保证?

我做了一个非常基本的测试,并在它们被消耗时偷看记录,并通过 Instant.now 的简单输出打印它们被处理的瞬间

KStream<String, String> akStream= builder.stream("A",
        Consumed.with(Serdes.String(), Serdes.String()).withOffsetResetPolicy(Topology.AutoOffsetReset.EARLIEST))
        .peek((s, string) -> System.out.println("Topic A at " + Instant.now() ));

KStream<String, String> bkStream= builder.stream("B",
        Consumed.with(Serdes.String(), Serdes.String()))
        .peek((s, string) -> System.out.println("Topic B " + Instant.now()));

这些是主题中记录的开始和结束时间戳

A : 2020-03-27 14:36:04 (epoch: 1585316164843) 2020-03-27 14:34:02 (epoch: 1585316042569)
B : 2020-03-30 11:04:17 (epoch: 1585559057167) 2020-03-17 14:44:38 (epoch: 1584452678527)

主题 B 记录在主题 A 之前被拾取。Sysout 显示来自主题 B 的所有记录 有人可以帮助理解这一点吗? 在编写具有多个输入源的流应用程序时,我想使用这种理解。

提前致谢

您构建流的方式,每个流都单独存在,没有排序保证。

关于基于时间戳处理记录。 您只能在一个时间窗口内执行此操作。 例如,如果您有两个主题 A 和 B,您可以加入它们,并使用时间窗口对事件进行排序。

<VO,VR> KStream<K,VR> join​(KStream<K,VO> otherStream,
                           ValueJoiner<? super V,? super VO,? extends VR> joiner,
                           JoinWindows windows)

这取决于。 一般情况下,不保证不同主题之间的处理顺序。 但是有一个例外:如果单个任务处理来自不同主题的数据,则记录将按时间戳顺序处理。 然而,这是一种尽力而为的方法; 从 Kafka Streams 2.3 开始,这些排序保证得到了改进,您可以使用max.task.idle.ms配置来影响它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM