在mysql数据库中具有两个不同表的两个kafka主题。
表1-交易数据
表2-交易明细数据
现在,我需要合并这两个kafka主题(又名mysql表)中的数据,并将其作为一个文档推送到Mongo Db。
尽管我可以使用kafka流执行相同操作,但需要建议如何处理以下情况
情况1-当Table1数据到达但不是Table2数据到达时
情况2-当Table2数据到达但不在Table1数据到达时
答案 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(...)
);
通常限制连接窗口的大小,以避免将数据无限长地保留。限制应该是来自不同流的数据的不同到达时间之间的最大差。