【问题标题】:Apache Kafka: 3 partitions, 3 consumers in the consumer group, each consumer should be multithreadedApache Kafka:3个分区,消费者组3个消费者,每个消费者应该是多线程的
【发布时间】:2020-04-01 21:21:26
【问题描述】:

假设Apache Kafka 中有一个包含 3 个分区的主题。我需要在一个消费者组中运行 3 个消费者,根据文档,这意味着每个消费者将从 1 个分区读取数据。

使用Spring Kafka 实现消费者。众所周知,默认情况下,所有消息都在单个线程中接收,但使用ConcurrentMessageListenerContainer 应该允许我们设置并发。

我想要什么?我想有效地使用服务器 CPU 资源,让每个消费者在单独的线程中接收和处理消息(在我们的例子中是 3 个线程,等于分区的数量)。

结果 - 消费者组中有 3 个消费者(3 个服务器),每个消费者从所有 3 个分区接收消息。

有可能吗?如果是的话,如果我只使用ConcurrentMessageListenerContainer并为每个分区指定3个监听器就足够了吗?

【问题讨论】:

  • 是的,它是.....

标签: java multithreading apache-kafka spring-kafka


【解决方案1】:

我对你的说法有点困惑。澄清一下,在 Kafka 中,只有一个消费者可以从一个消费者组中的一个分区中读取数据。同一个消费者组中的两个消费者不可能从同一个分区读取数据。

在一个消费者群体中,

  • 如果消费者数量大于分区数,则额外的消费者线程将处于空闲状态。
  • 如果消费者数量少于分区数,则同一消费者线程将从多个分区中读取

这段代码 sn-p 将从名为“mytopic”的主题中读取,它将使用 3 个线程从 3 个分区中读取 @KafkaListener(topics = "mytopic", concurrency = "3", groupId = "myconsumergroup")

【讨论】:

  • 这是否意味着只有 2 个选项 - 使用 1 个消费者和 3 个侦听器,或者使用 3 个消费者,但每个消费者只能从 1 个分区消费?
  • 您甚至可以有 3 个分区,但只有 2 个消费者,在这种情况下,其中一个消费者将从 2 个分区中读取。请记住,消费者组中的消费者可以是 - 同一应用程序中的不同线程 - 在相同或不同 VM 中运行的同一应用程序的多个实例 - 完全不同的应用程序(通常您不会在现实世界的应用程序中这样做,但它是可能)
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2020-09-19
相关资源
最近更新 更多