我是Kafka的新手,我想知道我所计划的实施是否可行且合理。
假设我们有两个来源s1
和s2
,它们分别向主题t1
和t2
发出一些消息。现在,我希望有一个接收器可以监听两个主题,并且希望它处理消息<m1, m2>
的元组,其中m1.key == m2.key
。
如果从未在m1.key
的某些消息中找到s2
,则接收器将完全忽略m1.key
(永远不会对其进行处理)。
总而言之,接收器仅适用于s1
和s2
使用过的键。
一些传统的,也许是幼稚的解决方案是拥有某种缓存或存储空间,并且仅当两条消息都在缓存中时才对项目进行处理。
我想知道卡夫卡是否提供解决此问题的方法。
答案 0 :(得分:1)
大多数现代流处理引擎,例如Apache Flink,Kafka Streams或Spark Streaming可以为您解决此问题。这三个人都经过了久经考验的Kafka消费者,都是为这种用例而构建的。
即使在那些框架中,也有多种不同的方法来实现如上所述的流连接。 例如,在Flink中,可以使用具有类似SQL语法的Table API。
我过去使用的内容有点像this SO answer中的示例(您可以将onchange
替换为Kafka Source)。
使用流时要记住的一件事是,当使用来自两个Kafka主题fromElements
和t1
的数据时,您没有任何顺序保证。您的代码需要考虑以任何顺序到达的消息。
编辑-刚意识到您的问题可能是关于如何使用Kafka Streams(而不是来自Kafka的数据流)实现联接的问题。在这种情况下,您可能会找到相关信息here