【发布时间】:2020-03-12 07:41:19
【问题描述】:
我正在使用 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 Boot 配置:
spring.kafka.listener.concurrency=10
我看到所有配置都有效,我在 jmx 中看到了我的 10 个线程:
然后我做了这样的测试:
@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!");
}
如果版本
也许我的期望不正确,这是 kafka 听众的正确行为。 请帮我处理一下kafka并发,为什么会这样?
【问题讨论】:
-
您是否按照预期的顺序获得记录版本?或者不一样
-
是的,我一个一个发:1,2,3
-
每个
@KafkaListener都有自己的消费者。具有相同组 id 的消费者不能多于主题的分区。如果您有 10 个@KafkaListener共享同一个组 id 从一个具有 1 个分区的主题消费,那么@KafkaListener中的 9 个将闲置无所事事。 -
您的主题有多少个分区以及您生成消息的顺序是什么?
标签: java spring spring-boot apache-kafka spring-kafka