何时使用ConcurrentKafkaListenerContainerFactory?

时间:2019-03-06 12:34:34

标签: java apache-kafka kafka-consumer-api spring-kafka

我是kafka的新手,我经历了documentation,但是我什么都听不懂。有人可以解释何时使用ConcurrentKafkaListenerContainerFactory类吗?我使用过Kafkaconsumer类,但是我在当前项目中看到了ConcurrentKafkaListenerContainerFactory。请说明其用途。

2 个答案:

答案 0 :(得分:1)

Kafka Consumer API不是线程安全的。 ConcurrentKafkaListenerContainerFactory api提供了同时使用Kafka Consumer API和设置其他kafka Consumer属性的方法。

答案 1 :(得分:1)

Kafka使用者不是线程安全的。所有网络I / O都发生在进行调用的应用程序线程中。用户有责任确保正确同步多线程访问。不同步的访问将导致ConcurrentModificationException.

  

如果为消费者分配了多个分区以从中获取数据,它将尝试同时从所有分区中进行消费,从而有效地赋予这些分区相同的消费优先级。但是,在某些情况下,消费者可能希望首先集中精力全速从分配的分区的某些子集中获取数据,而仅在这些分区需要消耗很少或没有数据的情况下才开始获取其他分区。

春季卡夫卡

ConcurrentKafkaListenerContainerFactory用于为带有@KafkaListener的注释方法创建容器

春季卡夫卡有两个MessageListenerContainer

KafkaMessageListenerContainer
ConcurrentMessageListenerContainer
  

KafkaMessageListenerContainer在单个线程上接收来自所有主题或分区的所有消息。 ConcurrentMessageListenerContainer委托一个或多个KafkaMessageListenerContainer实例以提供多线程使用。

使用ConcurrentMessageListenerContainer

@Bean
KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
                    kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                            new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setConcurrency(3);
    factory.getContainerProperties().setPollTimeout(3000);
    return factory;
  }

它具有并发属性。例如,container.setConcurrency(3)创建三个KafkaMessageListenerContainer实例。

  

如果提供了六个TopicPartition实例,并且并发为3;每个容器有两个分区。对于五个TopicPartition实例,两个容器获得两个分区,第三个容器获得一个分区。如果并发数大于TopicPartitions的数目,则将并发数下调以使每个容器获得一个分区。

这是文档here

的清晰示例