Apache Kafka:3个分区,消费者组3个消费者,每个消费者应该是多线程的
Apache Kafka: 3 partitions, 3 consumers in the consumer group, each consumer should be multithreaded
假设 Apache Kafka
中有一个主题有 3 个分区。我需要 运行 一个消费者组中的 3 个消费者,根据文档,这意味着每个消费者将从 1 个分区读取数据。
消费者是使用 Spring Kafka
实现的。众所周知,默认情况下,所有消息都在一个线程中接收,但是使用 ConcurrentMessageListenerContainer
应该可以让我们设置并发。
我想要什么?我想有效地使用服务器 CPU 资源并让每个消费者在单独的线程中接收和处理消息(在我们的例子中是 3 个线程,等于分区数)。
因此 - 消费者组中有 3 个消费者(3 个服务器),每个消费者都从所有 3 个分区接收消息。
可能吗?如果是,我只使用 ConcurrentMessageListenerContainer
并为每个分区指定 3 个侦听器就足够了吗?
我对你的说法有点困惑。澄清一下,在 Kafka 中,只有一个消费者可以从一个消费者组中的一个分区读取数据。同一消费者组中的两个消费者不可能从同一分区读取。
在一个消费者组中,
- 如果没有消费者大于分区数,那么额外的消费者线程将空闲。
- 如果没有消费者小于分区数,那么同一个消费者线程将从多个分区读取
此代码段将从名为 "mytopic" 的主题中读取,并将使用 3 个线程从 3 个分区中读取 @KafkaListener(topics = "mytopic", concurrency = "3", groupId = "myconsumergroup")
假设 Apache Kafka
中有一个主题有 3 个分区。我需要 运行 一个消费者组中的 3 个消费者,根据文档,这意味着每个消费者将从 1 个分区读取数据。
消费者是使用 Spring Kafka
实现的。众所周知,默认情况下,所有消息都在一个线程中接收,但是使用 ConcurrentMessageListenerContainer
应该可以让我们设置并发。
我想要什么?我想有效地使用服务器 CPU 资源并让每个消费者在单独的线程中接收和处理消息(在我们的例子中是 3 个线程,等于分区数)。
因此 - 消费者组中有 3 个消费者(3 个服务器),每个消费者都从所有 3 个分区接收消息。
可能吗?如果是,我只使用 ConcurrentMessageListenerContainer
并为每个分区指定 3 个侦听器就足够了吗?
我对你的说法有点困惑。澄清一下,在 Kafka 中,只有一个消费者可以从一个消费者组中的一个分区读取数据。同一消费者组中的两个消费者不可能从同一分区读取。
在一个消费者组中,
- 如果没有消费者大于分区数,那么额外的消费者线程将空闲。
- 如果没有消费者小于分区数,那么同一个消费者线程将从多个分区读取
此代码段将从名为 "mytopic" 的主题中读取,并将使用 3 个线程从 3 个分区中读取 @KafkaListener(topics = "mytopic", concurrency = "3", groupId = "myconsumergroup")