我希望能够使用流处理API,通过关键字外连接(outer join)几个Kafka主题(通常为2-10个)。所有主题都具有相同的关键字和分区。实现这种联接的一种方法是为每个主题创建一个KStream
并链接调用KStream.outerJoin
:
stream1
.outerJoin(stream2, ...)
.outerJoin(stream3, ...)
.outerJoin(stream4, ...)
然而,
KStream.outerJoin
的文档表明,每次调用 outerJoin
都会使两个输入流具体化,所以上述示例不仅具体化了流1到4,还具体化了stream1.outerJoin(stream2, ...)
和 stream1.outerJoin(stream2, ...).outerJoin(stream3, ...)
。相比直接连接这4个流,这将导致大量不必要的序列化、反序列化和I/O操作。上述方法的另一个问题是:
JoinWindow
在所有4个输入流中并不一致:一个 JoinWindow
用于连接流1和2,但随后需要使用一个单独的连接窗口来连接此流和流3等等。例如,我为每个连接指定了10秒的连接窗口,并且某些特定键的条目出现在流1中的时间为0秒,在流2中的时间为6秒,在流3中的时间为12秒,在流4中的时间为18秒,则连接的条目将在18秒后输出,导致延迟过高。结果取决于连接的顺序,这似乎不自然。有更好的使用 Kafka 进行多路连接的方法吗?