在一个 Spring Boot 应用程序中使用多个不同的 kafka 服务器的方法是什么?

问题描述 投票:0回答:2

我有一个 Spring Boot 应用程序,与 kafka 一起使用(假设 kafka#1) 现在我有一个案例,当我需要连接到外部服务(kafka#2)的kafka服务器时,明天应该添加另一个外部服务的kafka。

kafka#1、kafka#2、kafka#3 都有单独的主题。我已经设法找到那个主题,其中建议了一个简单的事情 - 将所有服务器添加到

bootstrap.servers
属性中,用逗号分隔。

我有点担心服务器到主题的映射 - 我认为 kafka 可以“询问”所有服务器有关所有主题的信息是不对的...

正确的做法是什么?

就应用程序而言,mho,最好有多个配置,例如:

kafka1.properties
kafka2.properties
kafka3.properties
。然后我可以使用适当的设置(消费者容器工厂和工厂)创建 kafka beans,并在 @KafkaListener 侦听器中定义所需的工厂。所以我可以避免任何不必要的服务器主题映射问题...

或者也许这很奇怪,我只需要在单个配置文件中添加 bootstrap.servers

kafka.properties
,不用担心?找不到任何相关信息...

java spring apache-kafka
2个回答
2
投票

如果您的所有 kafka 服务器都属于同一集群,则为您的客户端配置单一配置就足够了。 Kafka 服务器在内部相互通信,并共享集群中所有主题的最新元数据,即使该主题不在特定服务器上。

在定义

bootstrap.server
时,只需提及其中一台服务器就足够了。该配置的描述对此进行了更详细的解释:

“用于建立与 Kafka 集群的初始连接的主机/端口对列表。客户端将使用所有服务器,无论此处指定哪些服务器进行引导 - 该列表仅影响用于发现 Kafka 集群的初始主机。完整的服务器集。此列表的格式应为 host1:port1,host2:port2,.... 由于这些服务器仅用于初始连接以发现完整的集群成员身份(可能会动态更改),因此此列表不需要包含全套服务器(不过,您可能需要多个服务器,以防服务器停机)。

建议在引导服务器中列出多于一台服务器,以防其中一台服务器当前不可用。

此外,Kafka 服务器之间的互通在《Kafka - The Definitive Guide》一书中也有解释,可以在这里下载

“客户端如何知道将请求发送到哪里?Kafka 客户端使用另一个 请求类型称为元数据请求,其中包括客户端感兴趣的主题列表。服务器响应指定主题中存在哪些分区、每个分区的副本以及哪个副本是领导者。 元数据请求可以发送到任何代理,因为所有代理都有包含此信息的元数据缓存。


0
投票

我认为您可以在 @Configuration 类中配置第二个 KafkaTemplate bean。 因此,您将拥有 2 个 KafkaTemplate beans:1 个是“来自盒子”,带有 application.yml 中的配置,1 个是在 @Configuration 类中手动配置的。

我在这里找到了我的话的确认。 第一个答案:

是的,但如果你想同时消费和生产,你必须 手动配置消费者和生产者工厂@Beans等

启动只能从属性中自动配置其中一项。

但是如果您只是从一个集群中消费并生产 另外,可以通过属性来完成。

使用

spring.kafka. Producer.bootstrap-servers = ... ... spring.kafka.consumer.bootstrap-servers=... 这些将覆盖 共同属性。

© www.soinside.com 2019 - 2024. All rights reserved.