当您有多个服务实例监听某个主题时会发生什么?

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

我的理解是Spring-kafka管理服务内的并发。即侦听器只会使用来自指定分区的消息。

当服务有多个实例(可能有自己的一组侦听器)时也是这种情况吗?

例如2 个服务实例,每个实例有 3 个侦听器(全部位于同一组中),从具有 6 个分区的主题进行消费。

apache-kafka spring-kafka
1个回答
0
投票

AI(Bing)的回答,相当准确:

问: 使用spring boot微服务和spring-kafka,如果我的主题有两个分区并且我将并发设置为2,如果我启动第二个服务实例会发生什么?同一组中有 4 个消费者,其中 2 个会挨饿吗?

答: 在带有 Spring-Kafka 的 Spring Boot 微服务中,如果您的主题有两个分区并且您将并发设置为 2,则意味着您的 KafkaListener 中有两个线程,每个线程都可以从单独的分区进行消费。

当您启动第二个服务实例时,它还将创建另外两个消费者(假设配置相同)。这些消费者会加入同一个消费群体。但是,由于该主题只有两个分区,并且每个分区一次只能被一组中的一个消费者消费,因此其中两个消费者将不会收到任何消息。这是因为当有新的消费者加入消费者组时,Kafka的消费者协议会触发重新平衡,在这个重新平衡过程中,Kafka会尝试在组中的所有消费者之间分配主题分区以实现负载均衡。

因此,在您的场景中,同一组中确实有 4 个消费者,但只要另外两个消费者还活着并正在消费消息,其中 2 个就不会收到任何消息12。在消费者群体中,这通常被称为“饥饿”。如果其中一个活跃消费者出现故障,Kafka 将触发另一次重新平衡,而其中一个“饥饿”消费者将开始接收消息。

请注意,此行为基于 Kafka 的设计,以确保分区中的每条消息都按顺序消费。如果您想提高吞吐量,您可以考虑增加主题中的分区数量。但请记住,更多的分区可能会导致更多的重新平衡,这可能会影响性能2。根据您的具体用例找到平衡点非常重要。

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