@KafkaListener с одной темой и одним разделом

Я использую аннотацию 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);
    ...
    }

person Hobo Joe    schedule 04.03.2020    source источник


Ответы (2)


Правильный ли способ управления параллелизмом с помощью setConcurrency?

То, что у вас есть, правильно, но по умолчанию concurrency в контейнере равно 1, поэтому указывать его не нужно, если параллелизм не нужен.

Или мне нужно как-то создать KafkaMessageListenerContainer, который является однопоточным?

Параллельный контейнер создает «дочерний» KafkaMessageListenerContainer для каждого concurrency, поэтому для вас уже создан только один.

person Gary Russell    schedule 04.03.2020

В вашем случае параллелизм не имеет значения. Пока у вас один раздел, у вас всегда будет только один поток. Вот как рекомендуется работать с Apache Kafka: один поток на раздел. Итак, Spring для Apache Kafka следует этому требованию и не дает нам возможности нарушить поведение, даже если вы установите этот параллелизм для большого числа, вы не собираетесь опрашивать из раздела параллельно. Это начинает приносить пользу, когда у вас есть более одного раздела для использования.

person Artem Bilan    schedule 04.03.2020