@KafkaListener 具有单个主题和单个分区

@KafkaListener with single Topic and single Partition

我使用spring-kafka 注释@KafkaListener 来指定我的侦听器方法。

我使用单个分区的单个主题。消息永远不会超过每秒一两次,因此可以接受单个线程。 spring-kafka 文档说 @KafkaListener 默认使用 ConcurrentMessageListenerContainer。使用 setConcurrency 控制并发的正确方法是什么?

或者,我应该以某种方式创建一个单线程的 KafkaMessageListenerContainer 吗?

我目前使用的是:

    @Bean("appContainerFactory")
    KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
    kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<Integer, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConcurrency(1);
    ...
    }

在你的并发中没有任何价值。只要你只有一个分区,你就永远只有一个线程。这是建议使用 Apache Kafka 的方式:每个分区一个线程。因此,Apache Kafka 的 Spring 遵循此要求,并且不给我们打破行为的机会,即使您将并发设置为大数,您也不会从分区并行轮询。当您有多个分区要使用时,它开始带来价值。

Is the correct way to control concurrency by using setConcurrency?

你写的是对的,但是容器上默认的concurrency是1所以不需要并发的时候就不用指定了。

Or, should I be somehow create a KafkaMessageListenerContainer, which is single threaded?

并发容器为每个 concurrency 旋转一个 "child" KafkaMessageListenerContainer,因此已经为您创建了一个。