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

Posted

技术标签:

【中文标题】Kafka 流可以有效地处理加入流吗?【英文标题】:Can Kafka streams deal with joining streams efficiently? 【发布时间】:2019-02-03 17:43:24 【问题描述】:

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

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

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

总之,接收器只能在 s1s2 处理过的键上工作。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于Kafka 流可以有效地处理加入流吗?的主要内容,如果未能解决你的问题,请参考以下文章

kafka 基础介绍

处理流阅读器会关闭流吗?

我应该尽可能使用并行流吗?

如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?

有没有一种有效的方法来外部加入几个(超过 2 个)kafka 主题?

Kafka流:将值连接到数组中