关于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)
在主题A之前获取主题B记录。Sysout显示主题B的所有记录。有人可以帮助您理解吗?在编写具有多个输入源的流应用程序时,我想利用这种理解。
预先感谢
答案 0 :(得分:1)
构建流的方式,每个流本身都存在,没有定额保证金。
关于基于时间戳处理记录。您只能在一个时间窗口内执行此操作。例如,如果您有两个主题A和B,则可以将它们加入,并使用时间窗可以订购事件。
<VO,VR> KStream<K,VR> join(KStream<K,VO> otherStream,
ValueJoiner<? super V,? super VO,? extends VR> joiner,
JoinWindows windows)
答案 1 :(得分:0)
这取决于。通常,不能保证不同主题之间的处理顺序。但是,有一个例外:如果单个任务处理来自不同主题的数据,则记录将按时间戳顺序处理。但是,这是一种尽力而为的方法。从Kafka Streams 2.3开始,这些订购保证得到了改善,您可以使用max.task.idle.ms
配置来影响它们。