gpt4 book ai didi

java - Spring @KafkaListener 和并发

转载 作者:行者123 更新时间:2023-11-29 08:20:44 24 4
gpt4 key购买 nike

我正在使用 spring boot + spring @KafkaListener。我期望的行为是:我的 kafka 监听器在 10 个线程中读取消息。因此,如果其中一个线程挂起,其他消息将继续读取和处理消息。

我定义了bean

@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 启动配置:

spring.kafka.listener.concurrency=10

我看到所有配置都有效,我在 jmx 中看到我的 10 个线程:

enter image description here

但后来我做了这样的测试:

 @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,则挂起,否则 - 工作。我发送了 3 条版本为 1,2 和 3 的消息。我希望版本 1 和版本 2 的消息会挂起,但是版本 3 将在它到达监听器时被处理。但不幸的是,版本 3 的消息在开始处理之前等待消息 1 和 2。

也许我的期望不正确,这是kafka listener的正确行为。请帮我处理一下kafka并发,为什么会这样?

最佳答案

Kafka 不是那样工作的;您至少需要与消费者一样多的分区(由 spring 容器中的 concurrency 控制)。

此外,一次只有一个消费者(在一组中)可以从一个分区中消费,因此,即使您增加分区,“卡住”消费者后面的同一分区中的记录也不会被其他消费者接收。

关于java - Spring @KafkaListener 和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com