【问题标题】:@KafkaListener with single Topic and single Partition具有单个主题和单个分区的 @KafkaListener
【发布时间】:2020-06-17 02:26:03
【问题描述】:

我使用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);
    ...
    }

【问题讨论】:

    标签: spring-boot apache-kafka spring-kafka


    【解决方案1】:

    使用 setConcurrency 控制并发是否正确?

    你所拥有的是正确的,但是容器上默认的concurrency 是 1,所以当你不需要并发时不需要指定它。

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

    并发容器会为每个 concurrency 旋转一个“子”KafkaMessageListenerContainer,因此已经为您创建了一个。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-14
        • 2020-01-01
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 2020-05-03
        • 1970-01-01
        相关资源
        最近更新 更多