【发布时间】:2017-12-02 08:14:26
【问题描述】:
我想通过键外连接几个(通常是 2-10 个)Kafka 主题,最好使用流式 API。所有主题都将具有相同的键和分区。执行此连接的一种方法是为每个主题创建一个 KStream 并将调用链接到 KStream.outerJoin:
stream1
.outerJoin(stream2, ...)
.outerJoin(stream3, ...)
.outerJoin(stream4, ...)
但是,KStream.outerJoin 的 documentation 表明对 outerJoin 的每次调用都将实现其两个输入流,因此上述示例不仅会实现流 1 到 4,还会实现 stream1.outerJoin(stream2, ...) 和 stream1.outerJoin(stream2, ...).outerJoin(stream3, ...)。与直接加入 4 个流相比,会有很多不必要的序列化、反序列化和 I/O。
上述方法的另一个问题是JoinWindow 在所有 4 个输入流中都不一致:一个 JoinWindow 将用于连接流 1 和 2,但随后将使用单独的连接窗口来连接此流和流 3 等。例如,我为每个连接指定 10 秒的连接窗口,并且具有特定键的条目在 0 秒时出现在流 1 中,在 6 秒时出现在流 2 中,在 12 秒时出现在流 3 和流中4 在 18 秒时,加入的项目会在 18 秒后输出,导致延迟过高。结果取决于连接的顺序,这似乎不自然。
有没有更好的方法来使用 Kafka 进行多路连接?
【问题讨论】:
标签: java stream apache-kafka outer-join