监听器上的 Kafka 并发设置以限制并行处理

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

我并不是百分百确定我是否正确理解 Kafka 并发设置,所以希望是一个简单的问题:

假设我有一个典型的 Spring Boot 应用程序,其中有一个 KafkaListener 使用具有多个(许多)分区的主题。

@KafkaListener(topics = ["#{appProperties.topic}"], concurrency = "1")
fun receiveMessages(record: ConsumerRecord<Key, Value?>) {

假设我将

concurrency
参数设置为 1。我的问题是,即使我部署了 Spring Boot 应用程序的多个实例,这是否确保消息仅由一个侦听器在单个线程中使用并行工作(Kubernetes)?这个并发参数是在 Kafka 本身上设置的,而不是在应用程序上设置的吗?如果已经有一个阅读内容,它是否会阻止应用程序的新实例从该主题中读取任何内容?

我假设所有监听器都有相同的组 ID/属于同一个消费者组。

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

参数并发仅限于单个 SpringApplication,因此如果您在 Kubernetes 上有一个服务的多个副本,那么同一个 Kafka 主题将会有更多的消费者。

例如,设置如下:

concurrency = 1

让我们考虑一个场景,主题为

Topic1
,有 6 个分区。对于 1 个副本,所有分区都将分配给该副本的单个使用者。如果添加新副本,Kafka Brokers 将执行重新平衡,通常在两个消费者之间平均分配分区。在我们的示例中,您将有 3 个分区分配给副本 1,并将 3 个分区分配给副本 2。

concurrency
参数将影响每个副本。在前面的示例中,您可以通过将
concurrency
设置为 2 来避免添加新副本。然后 Spring 将在每个副本上实例化 2 个线程作为使用者。但是,请注意,这会影响每个副本的内存,因为同一个副本上将有多个使用者。

注意:具有相同组ID的消费者不会读取相同的消息,但如果提供超过1个分区,则会并行操作。

希望这将有助于更多地了解并发参数:)

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