卡夫卡流能否有效处理加入流?

时间:2019-02-03 17:43:25

标签: apache-kafka distributed-system stream-processing

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

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

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

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

一些传统的,也许是幼稚的解决方案是拥有某种缓存或存储空间,并且仅当两条消息都在缓存中时才对项目进行处理。

我想知道卡夫卡是否提供解决此问题的方法。

1 个答案:

答案 0 :(得分:1)

大多数现代流处理引擎,例如Apache FlinkKafka StreamsSpark Streaming可以为您解决此问题。这三个人都经过了久经考验的Kafka消费者,都是为这种用例而构建的。

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

我过去使用的内容有点像this SO answer中的示例(您可以将onchange替换为Kafka Source)。

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

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