Java 卡夫卡2消费者工厂监听器不经常连接

Java 卡夫卡2消费者工厂监听器不经常连接,java,spring-boot,kafka-consumer-api,spring-kafka,Java,Spring Boot,Kafka Consumer Api,Spring Kafka,我们在项目中使用的是Spring Kafka 2.1.4.RELEASE版本,我们有以下配置: @EnableKafka 公共级卡夫卡康菲{ @值(${spring.kafka.bootstrap servers}”) 私有字符串引导服务器; @配置 类ProducerConfig{ @豆子 公共地图产品配置(){ Map props=newhashmap(); put(ProducerConfig.BOOTSTRAP\u server\u CONFIG,bootstrapserver); pu

我们在项目中使用的是Spring Kafka 2.1.4.RELEASE版本,我们有以下配置:

@EnableKafka
公共级卡夫卡康菲{
@值(${spring.kafka.bootstrap servers}”)
私有字符串引导服务器;
@配置
类ProducerConfig{
@豆子
公共地图产品配置(){
Map props=newhashmap();
put(ProducerConfig.BOOTSTRAP\u server\u CONFIG,bootstrapserver);
put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,ASerializer.CLASS);
返回道具;
}
@豆子
公共生产工厂生产工厂(){
返回新的DefaultKafkaProducerFactory(producerConfigs());
}
@豆子
公共卡夫卡模板卡夫卡模板(){
返回新的卡夫卡模板(producerFactory());
}
}
@配置
类ConsumerConfig{
@值(${spring.kafka.consumer.groupid})
私有字符串groupId;
@值(${spring.kafka.consumer.auto offset reset}”)
私有字符串自动偏移设置;
@值(${spring.kafka.consumer.enable auto commit}”)
私有布尔启用自动提交;
@值(${spring.kafka.consumer.max poll records})
私有整数记录;
@豆子
公共地图firstConsumerConfig(){
Map props=getCommonConsumerConfig();
put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,ADeserializer.CLASS);
返回道具;
}
@豆子
公共地图secondConsumerConfig(){
Map props=getCommonConsumerConfig();
put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,BDeserializer.CLASS);
返回道具;
}
@豆子
公共消费者工厂firstConsumerFactory(){
返回新的DefaultKafkanConsumerFactory(firstConsumerConfig());
}
@豆子
公共KafkaListenerContainerFactory FirstContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(firstConsumerFactory());
返回工厂;
}
@豆子
公共消费者工厂第二消费者工厂(){
返回新的DefaultKafkanConsumerFactory(secondConsumerConfig());
}
@豆子
公共KafkaListenerContainerFactory输出容器工厂(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(secondConsumerFactory());
返回工厂;
}
私有映射getCommonConsumerConfig(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP\u server\u CONFIG,bootstrapserver);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,groupId);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,autoOffsetReset);
put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,enableautocomit);
put(ConsumerConfig.MAX\u POLL\u RECORDS\u CONFIG,maxPollRecords);
返回道具;
}
}
}
如你所见,我们使用2家消费品工厂。我们有以下消费者类别:

@ConfigurationProperties
@服务
公共类侦听器{
@KafkaListener(containerFactory=“firstContainerFactory”,topics=“someTopic”)
public void firstListener(@Payload A first){
//一些逻辑
}
@KafkaListener(containerFactory=“secondContainerFactory”,主题={
//主题列表
})
public void secondTopicListener(@Payload B second){
//一些逻辑
}
}

所以我们在启动这个应用程序的过程中注意到的是,它并没有一直连接到这两个主题。有时它只连接到第二个主题,或者只连接到第一个主题,并且可能连接到第一个和第二个主题(这是正确的)。因此,请您帮助理解此处的错误配置是什么?

将每个侦听器放入不同的
组.id
(您可以使用
@KafkaListener
上的
groupId
属性,该属性覆盖消费者工厂)。否则,当第二次启动时,会在第一次启动时导致重新平衡。当前的2.1.x版本是2.1.10。

好的,经过进一步调查,我能够确定我这方面发生了什么样的问题。所以基本上我们有一个消费者群体,有多个主题。所以在我的例子中,这些主题中的每一个都有0个分区(据我所知,没有分区,我们使用主题的1个队列进行操作)。因此,当我连接到kafka实例时——所有消费者都连接到这些主题,但当有人也连接到这些主题(可能是我的同事)时,就会发生重新平衡,他开始听其中一个主题,而不是我(因为每个分区只有一个消费者可以显示)。

什么是“连接”呢? 也许你只是受到卡夫卡团体管理的困扰?你应该为每个人使用不同的
group.id
;否则,其中一个的重新平衡将影响另一个。Spring似乎不会获取您的ProducerConfig,因为它不是静态的。它实际上是在具有配置注释的情况下获取的。那么我可以为每个消费者分配不同的组ID吗?或者是一些卡夫卡设置?您可以在
firstConsumerConfig
secondConsumerConfig
中设置不同的
group.id
(而不是在
getCommonConsumerConfig()
中设置单个值)