Spring Kafka MessageListenerContainer

时间:2019-02-16 21:07:15

标签: kafka-consumer-api spring-kafka

我正在查看春季的Kafka代码,并且有一些疑问:

  1. 如果我们使用1个@kafkaListener和2个主题,那么spring Kafka会创建一个MessageListenerContainer。而且,如果我为每个主题使用单独的@kafkaListener,则将创建2个MessageListenerContainer。

  2. MessageListenerContainer表示消费者吗?

  3. 如果我在ConcurrentKafkaListenerContainerFactory中将并发设置为4,那意味着对于每个kafkaListener,我都会使用Broker打开4个线程?这意味着协调员将他们视为4个不同的消费者。

  4. kafkaListener如何进行轮询?每次只能从经纪人那里获得1条ConsumerRecord吗?

请帮助。

1 个答案:

答案 0 :(得分:1)

MessageListenerContainer有两种实现方式-KafkaMessageListenerContainer(KMLC)和ConcurrentMessageListenerContainer(CMLC)。

CMLC只是一个或多个KMLC的包装,其中concurrency指定了KMLC的数量。

@KafkaListener始终使用CMLC。

每个KMLC都获得一个Consumer(和一个线程)。线程使用指定的poll()连续pollTimeout消费消费者。

主题/分区在KMLC之间的分布方式取决于

  • 主题有多少个分区
  • 消费者的partition.assignment.strategy财产

如果您的多个主题的分区数少于并发数,则可能需要一个备用的分区分配器,例如循环分配器,否则您将有闲置的容器没有分配。

  1. 那是正确的;如果您明确希望每个主题使用不同的容器,则可以在同一方法上提供多个@KafkaListener注释。
  2. 请参阅上面的说明。
  3. 那是正确的-这是与Kafka并发的唯一方法(无需添加非常复杂的逻辑来管理偏移量)。
  4. 每次民意测验返回的记录数取决于许多消费者属性,max.poll.recordsfetch.min.bytesfetch.max.wait.ms