一、问题概述

最近碰到了一个问题,使用命令查看kafka的某个topic的消费情况,发现这个topic没有消费者,剩余消息(LAG)一直是满的;
但是查看java后台日志,发现确实消费了这个topic,功能正常;

所以问题就是查看kafka的topic的消费情况时,LAG为什么不减少、并且显示没有消费者呢?

二、问题详情

1.kafka有一个命令,可以查看某个组中的topic的消费情况,样例如下:

./kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group commonGroupTest-push --describe

其中commonGroupTest-push是组名;
执行后的结果样例如下:
在这里插入图片描述
如图,组为commonGroupTest-push;
topic为basicLawExam;
显示剩余消息数(LAG)为69182;
没有消费者;

2.但是,查看java后台的代码,确实在监听basicLawExam;
查看日志,确实消费了这个topic里的消息,功能正常;

3.按道理这个LAG(剩余消息数)应该是0才对,并且应该有消费者;
但是不知道为什么,LAG只增不减,并且显示没有消费者。

三、原因与解决方法

1.虽然java后台功能正常,确实收到了该topic的消息;但是这个LAG显示的实在是看不懂,因此请教了其它同事。

2.结果发现,找错group了。

3.java后台代码有两个地方,如下:
在这里插入图片描述
在这里插入图片描述
其中,第一个图片,是xxx.java,配置了kafka消费者,消费topic为basicLawExam,id是basicLawExamId;
第二个图片,是application.yml,配置了group-id: commonGroupTest-push

4.当时我只看到yml中配置了group-id,于是执行了下方的查询kafka的topic消费情况的语句:

./kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group commonGroupTest-push --describe

执行这句的话,结果就是显示LAG数只增不减,并且没有消费者。

5.实际上,第一个图片中配置了id=“basicLawExamId”,这个id与group-id的含义相同;
yml中配置的group-id,应该是一个全局的group-id;
如果第一个图片中没有配置id的话,就会使用yml中配置的group-id;
但是第一个图片配置了id,所以,如果想看topic消费情况,需要执行下面这句命令:

./kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group basicLawExamId --describe

结果如下:
在这里插入图片描述
可以看到,group为basicLawExamId的topic反映的才是java后台消费的那个,这个LAG为0,才是正确结果。

6.至于为什么group为commonGroupTest-push中也会有basicLawExam这个topic,应该是yml中配置了全局group导致的。(如果不在yml中配置group、只在@KafkaListener中配置id的话,应该就更好区分了,这样的话就没有commonGroupTest-push这个多余的group、只有basicLawExamId这个group了)

四、总结

1.kafka中,生产者只有topic,只要配置向哪个topic扔消息即可。
2.kafka中,消费者除了指定topic,还要指定group;
同一个topic中的消息,如果有不同group的消费者的话,是可以重复消费消息的。(如果不想重复消费,就把多个消费者的 group-id/id 配置成一样的)
3.yml中的group-id与@KafkaListener中的id的含义是相同的,需要注意。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐