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

时间:2020-03-04 14:49:06

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用setConcurrency控制并发的正确方法是吗?

您所拥有的是正确的,但是容器上的默认concurrency为1,因此在不需要并发时不必指定它。

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

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