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

Sim*_*mon 5 apache-kafka apache-kafka-streams

我正在寻找一种根据事件时间合并两个 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} }
Run Code Online (Sandbox Code Playgroud)

预期输出应如下所示:

{ {1 :: 12:00pm} {2 :: 12:10pm} {1 :: 13:00pm} {2 :: 13:10pm} {3 :: 14:50pm} {4 :: 15:00pm} {3 :: 15:50pm} {4 :: 16:00pm} }
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*Sax 7

Kafka Streams(从版本 2.1.0 开始)实现了您所描述的确切算法。因此,一个简单的:

StreamsBuilder builder = new StreamsBuilder();
builder
    .stream(Arrays.asList("firstInputTopic", "secondInputTopic"))
    .to("outputTopidName");
Run Code Online (Sandbox Code Playgroud)

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

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

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

此外,您需要实现和配置一个TimestampExtractor从值中获取时间戳的自定义。