Kafka 流可以有效地处理加入流吗?
Posted
技术标签:
【中文标题】Kafka 流可以有效地处理加入流吗?【英文标题】:Can Kafka streams deal with joining streams efficiently? 【发布时间】:2019-02-03 17:43:24 【问题描述】:我是 Kafka 新手,我想知道我的计划是否可行和合理实施。
假设我们有两个源,s1
和 s2
,它们分别向主题 t1
和 t2
发出一些消息。现在,我想要一个接收两个主题的接收器,并且我希望它处理消息元组<m1, m2>
where m1.key == m2.key
。
如果在s2
的某些消息中从未找到m1.key
,则接收器完全忽略m1.key
(永远不会处理它)。
总之,接收器只能在 s1
和 s2
处理过的键上工作。
一些传统的并且可能是幼稚的解决方案是拥有某种缓存或存储,并且仅当两条消息都在缓存中时才处理一个项目。
我想知道 Kafka 是否提供解决此问题的方法。
【问题讨论】:
【参考方案1】:大多数现代流处理引擎,例如Apache Flink、Kafka Streams 或Spark Streaming 都可以为您解决这个问题。这三个人都为此类用例构建了经过实战考验的 Kafka 消费者。
即使在这些框架中,也有多种不同的方法可以实现上述流式连接。 例如,在 Flink 中,可以使用Table API,它具有类似 SQL 的语法。
我过去使用的有点像this SO answer 中的示例(您可以将fromElements
替换为Kafka Source)。
使用流时要记住的一件事是,在使用来自两个 Kafka 主题 t1
和 t2
的数据时,您没有任何顺序保证。您的代码需要考虑以任何顺序到达的消息。
编辑 - 刚刚意识到您的问题可能是关于如何使用 Kafka 流而不是来自 Kafka 的数据流来实现连接。在这种情况下,您可能会找到相关信息here
【讨论】:
以上是关于Kafka 流可以有效地处理加入流吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?