Kafka 流可以有效地处理加入流吗?

Can Kafka streams deal with joining streams efficiently?

我是 Kafka 的新手,我想知道我计划的实施是否可行且合理。

假设我们有两个源,s1s2,它们分别向主题 t1t2 发出一些消息。现在,我想要一个收听两个主题的接收器,我希望它能够处理 <m1, m2> 的消息元组,其中 m1.key == m2.key.

如果 m1.key 从未在 s2 的某些消息中找到,则接收器完全忽略 m1.key(永远不会处理它)。

总而言之,接收器仅适用于 s1s2 使用的键。

一些传统且可能幼稚的解决方案是拥有某种缓存或存储,并且仅当两条消息都在缓存中时才处理一个项目。

我想知道 Kafka 是否提供了解决这个问题的方法。

大多数现代流处理引擎,例如Apache Flink, Kafka Streams or Spark Streaming都可以为您解决这个问题。这三者都经过了针对此类用例构建的 Kafka 消费者的实战测试。

即使在这些框架内,也有多种不同的方法可以实现上述流连接。 例如,在 Flink 中,可以使用具有类似 SQL 语法的 Table API

我以前用的有点像中的例子(你可以用Kafka Source替换fromElements)。

使用流时要记住的一件事是,在使用来自两个 Kafka 主题 t1t2 的数据时,您没有任何顺序保证。您的代码需要考虑以任何顺序到达的消息。

编辑 - 刚刚意识到您的问题可能是关于如何使用 Kafka Streams 而非来自 Kafka 的数据流来实现连接。在这种情况下,您可能会找到相关信息 here