Как реализовать потребительскую безопасность потоков с помощью Spring-Kafka - PullRequest
0 голосов
/ 21 февраля 2020

Я использую весеннюю загрузку 2.1.7.RELEASE и spring-kafka 2.2.7.RELEASE. И я использую аннотацию @KafkaListener для создания потребителя, и я использую все настройки по умолчанию для потребителя.

Вот моя конфигурация потребителя:

@Configuration
@EnableKafka
public class KafkaConsumerCommonConfig implements KafkaListenerConfigurer {

      @Bean
      public <K,V> ConcurrentKafkaListenerContainerFactory<String, Object> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(primaryConsumerFactory());
        factory.getContainerProperties().setMissingTopicsFatal(false);
        return factory;
      }

      @Bean
      public DefaultKafkaConsumerFactory<Object, Object> primaryConsumerFactory() {
        return new DefaultKafkaConsumerFactory<>(sapphireKafkaConsumerConfig.getConfigs());
      }

}

По некоторым причинам у меня есть несколько потребителей в одном приложении, как показано ниже.

@KafkaListener(topics = "TEST_TOPIC1")
public void consumer1(){

}

@KafkaListener(topics = "TEST_TOPIC2")
public void consumer2(){

}

@KafkaListener(topics = "TEST_TOPIC3")
public void consumer3(){

}

С учетом сказанного, согласно документу «Безопасность потребительских потоков»

Вы не можете иметь несколько потребителей, принадлежащих к одной группе, в одном потоке, и вы не можете иметь несколько потоков, безопасно использующих одного и того же потребителя. Один потребитель на поток - это правило. Чтобы запустить несколько потребителей в одной и той же группе в одном приложении, вам нужно будет запустить каждого из них в отдельном потоке. Полезно обернуть логи потребителя c в свой собственный объект, а затем использовать ExecutorService в Java для запуска нескольких потоков, каждый со своим собственным потребителем.

Теперь мой вопрос, должен ли я что-то делать дополнительные при использовании приведенного выше кода с использованием Spring-Kafka для решения этого сценария или не имеет значения, потому что группа будет генерироваться случайным образом, как я не указал? Пожалуйста, предложите.

1 Ответ

2 голосов
/ 21 февраля 2020

Все ваши слушатели настроены на разные темы. Таким образом, их группа полностью не имеет значения. Группа приходит на сцену, когда у вас есть несколько потребителей для одной и той же топи c.

...