我是kafka的新手,我经历了documentation,但是我什么都听不懂。有人可以解释何时使用ConcurrentKafkaListenerContainerFactory
类吗?我使用过Kafkaconsumer
类,但是我在当前项目中看到了ConcurrentKafkaListenerContainerFactory
。请说明其用途。
答案 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
的清晰示例