如何在单个 Kafka Streams 应用程序中连接到多个集群?

Posted

技术标签:

【中文标题】如何在单个 Kafka Streams 应用程序中连接到多个集群?【英文标题】:How to connect to multiple clusters in a single Kafka Streams application? 【发布时间】:2018-02-01 12:20:27 【问题描述】:

在Kafka Streams Developer Guide 中写道:

Kafka Streams 应用程序只能与单个 Kafka 集群通信 由此配置值指定。未来版本的 Kafka Streams 将 支持连接到不同的 Kafka 集群以读取输入流和 写入输出流。

这是否意味着我的整个应用程序只能连接到单个 Kafka 集群,或者KafkaStreams 的每个实例只能连接到单个集群?

我可以创建多个具有不同属性的 KafkaStreams 实例连接到不同的集群吗?

【问题讨论】:

【参考方案1】:

表示单个应用只能连接一个集群。

您无法从集群 A 读取主题并将计算结果写入集群 B。 不可能从具有相同实例的两个不同集群中读取两个主题。

我可以创建多个具有不同属性的 KafkaStreams 实例连接到不同的集群吗?

是的,当然。但是那些不同的实例将是不同的应用程序。 (想想“消费者群体”。)

更新:

在单个 JVM 中,您可以创建任意数量的 KafkaStreams 实例。您还可以将它们配置为连接到不同的集群(如果您想要进行相同的处理,您可以为所有这些集群使用相同的KStreamBuilder)。

【讨论】:

我认为 mixiul__ 询问是否可以使用单个 Java 应用程序创建多个 KafkaStreams 实例,然后每个实例连接到不同的集群。 没错。对于上下文,我想在单个 Java 应用程序中使用来自两个不同集群的相同事件类型。我希望将我的处理逻辑放在一个可以实例化两次的类中,每个类都有自己的集群特定的 KafkaStreams 实例。 更新了我的答案:是的,你可以这样做。 “在单个 JVM 中,您可以创建任意数量的 KafkaStreams 实例。” 为什么要这样做?我很好奇这些用例可能是什么(来自受信任的来源)。 如果你想处理来自不同集群的数据。 -- 也就是问题是关于什么的。【参考方案2】:

只是为了补充@Matthias J. Sax的出色答案。

这是否意味着我的整个应用程序只能连接到单个 Kafka 集群,或者 KafkaStreams 的每个实例只能连接到单个集群?

我认为这里有两个问题。

这取决于“我的整个应用程序”的定义,即它可能只是单个KafkaStreams 实例或单个JVM 上的多个实例,或者可能是单个JVM 上的多个KafkaStreams 实例作为 pod 执行的 Docker 容器中的 JVM。不管是什么,您都会发现“我的整个应用程序”有点过于宽泛,而且不是很精确。

关键是您无法创建可以与多个 Kafka 集群通信的 KafkaStreams 实例(因为配置是通过映射中键值对的属性),因此您可以回答你自己的问题,你不能吗?


无法在 Kafka Streams 应用程序中使用两个或多个 Kafka 集群是 Kafka Streams 和 Spark Structured Streaming 之间的区别之一(后者能够使用与您一样多的 Kafka 集群想要,因此您可以在不同的 Kafka 集群之间构建管道)。

【讨论】:

以上是关于如何在单个 Kafka Streams 应用程序中连接到多个集群?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制kafka-streams中的rocksdb内存使用量

事件采购 - Apache Kafka + Kafka Streams - 如何确保原子性/交易性

如何忽略从同一主题读取和写入不同事件类型的 Kafka Streams 应用程序中的某些类型的消息

Kafka Streams 在 HDFS 上查找数据

kafka在 Kafka Streams 中启用 Exactly-Once

如何有效地链接来自 Kafka Streams 中平面 api 数据的 groupby 查询?