Kafka流控制流

时间:2020-03-30 13:35:39

标签: java apache-kafka apache-kafka-streams

关于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的所有记录。有人可以帮助您理解吗?在编写具有多个输入源的流应用程序时,我想利用这种理解。

预先感谢

2 个答案:

答案 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配置来影响它们。