Spring @KafkaListener and concurrency
我正在使用spring boot spring @KafkaListener。我期望的行为是:我的kafka侦听器读取10个线程中的消息。因此,如果线程之一挂起,则其他消息将继续读取和处理消息。
我定义了
的bean
1 2 3 4 5 6 7 8 9 10 11 12 | @Bean public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory( ConcurrentKafkaListenerContainerFactoryConfigurer configurer, ConsumerFactory<Object, Object> kafkaConsumerFactory) { ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>(); configurer.configure(factory, kafkaConsumerFactory); factory.getContainerProperties().setMissingTopicsFatal(false); factory.getContainerProperties().setCommitLogLevel(LogIfLevelEnabled.Level.INFO); return factory; } |
和spring boot配置:
1 | spring.kafka.listener.concurrency=10 |
我看到所有配置都能正常工作,我在jmx中看到了10个线程:
但是我进行了这样的测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @KafkaListener(topics = { "${topic.name}" }, clientIdPrefix ="${kafka.client.id.prefix}", idIsGroup = false, id ="${kafka.listener.name}", containerFactory ="kafkaListenerContainerFactory") public void listen(ConsumerRecord<String, String> record) { if(record.getVersion() < 3) { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } else System.out.println("It works!"); } |
如果版本小于3,则挂起,否则-运行。
我发送了1,2和3版本的3条消息。我希望版本1和2的消息会挂起,但是版本3将在侦听器时处理。但是不幸的是,版本3的消息在开始处理之前会等待消息1和2。
也许我的期望不对,这是kafka监听器的正确行为。
请帮助我处理kafka并发,为什么会这样?
Kafka不能那样工作;您至少需要与使用者一样多的分区(由spring容器中的
此外,一次(一个组)一个使用者只能一次从一个分区中使用,因此,即使您增加了分区,"卡住"的使用者后面相同分区中的记录也不会被其他使用者接收。铅>
如果要对Kafka进行故障转移,则必须启动应用程序的更多实例。
示例:您有一个名为
有关它的更多信息,请在Google上搜索:Kafka Consumer Groups。