当第二个主题数据迟到时,如何合并两个kafka主题数据

时间:2020-08-17 07:31:52

标签: apache-kafka apache-kafka-streams

在mysql数据库中具有两个不同表的两个kafka主题。

表1-交易数据

表2-交易明细数据

现在,我需要合并这两个kafka主题(又名mysql表)中的数据,并将其作为一个文档推送到Mongo Db。

尽管我可以使用kafka流执行相同操作,但需要建议如何处理以下情况

情况1-当Table1数据到达但不是Table2数据到达时

情况2-当Table2数据到达但不在Table1数据到达时

1 个答案:

答案 0 :(得分:0)

将数据临时存储在窗口键值存储中。

当数据从stream1到达时:查看是否有来自stream2的匹配数据。如果是这样,请合并数据并将其存储在MongoDB中。如果不是,请将流1的数据存储在窗口存储中。

当数据从stream2到达时:查看是否有来自stream1的匹配数据。如果是这样,请合并数据并将其存储在MongoDB中。如果没有,则将stream2中的数据存储在窗口存储中。

KafkaStreams中窗口存储的默认实现是每个分区的RocksDB实例。要使此工作正常进行,必须确保两个流都具有相同的分区。

这正是kafka流在KStream.join(Kstream,...)之后执行的操作:

KStream<String, String> joined = left.join(right,
    (leftValue, rightValue) -> combine(leftValue, rightValue),
    JoinWindows.of(...),
    Joined.with(...)
);

通常限制连接窗口的大小,以避免将数据无限长地保留。限制应该是来自不同流的数据的不同到达时间之间的最大差。