使用 Kafka Streams DSL 对两个 Kafka 主题进行事件时间合并

Event-Time merge of two Kafka topics using Kafka Streams DSL

我正在寻找一种方法来根据事件时间合并两个 Kafka 主题。

例如,我有两个具有以下架构的主题 {event-key}:: {event-time-as-value}

topic I -  { {1 :: 12:00pm} {2 :: 12:10pm} {3 :: 14:50pm} {4 :: 15:00pm} }
topic II - { {1 :: 13:00pm} {2 :: 13:10pm} {3 :: 15:50pm} {4 :: 16:00pm} }

预期输出应如下所示:

{ {1 :: 12:00pm} {2 :: 12:10pm} {1 :: 13:00pm} {2 :: 13:10pm} {3 :: 14:50pm} {4 :: 15:00pm} {3 :: 15:50pm} {4 :: 16:00pm} }

有没有办法使用 Kafka Streams DSL 来做到这一点?

注意事项:原始主题很有可能没有按事件时间排序,这没关系。我希望算法始终选择当前位于每个主题开头的两个事件中最早的一个(与 merge two sorted arrays 算法的工作方式相同)

Kafka Streams(自 2.1.0 版起)实现了您描述的确切算法。因此,一个简单的:

StreamsBuilder builder = new StreamsBuilder();
builder
    .stream(Arrays.asList("firstInputTopic", "secondInputTopic"))
    .to("outputTopidName");

应该做你想做的。请注意,该程序将在每个分区的基础上合并数据。

还要考虑配置max.task.idle.ms

有关更多详细信息,请阅读相应的 KIP:https://cwiki.apache.org/confluence/display/KAFKA/KIP-353%3A+Improve+Kafka+Streams+Timestamp+Synchronization

此外,您需要实施和配置自定义 TimestampExtractor 以从值中获取时间戳。