RocketMQ版本:3.4.6java
RocketMQ集群的某个topic,在一部分节点上消费有“断层”,这部分数据一致没办法消费。shell
一顿操做猛如虎的调查以后发现,spa
该Topic的消费者的客户端链接数不正确。orm
程序中设置的客户端数明明是4个,blog
可是Web页面上显示的是5个。进程
OK,如何才能知道这些客户端程序究竟是哪些呢?io
看了一下RocketMQ的命令列表,发现里面有一个命令好像有戏。集群
用这个命令尝试了一下,果真有效。grep
命令:sh /home/hadmin/alibaba-rocketmq/bin/mqadmin consumerConnection -n "10.11.2.4:9876;10.11.2.5:9876" -g face2程序
用这个命令能够查看出,这个消费组的客户端是在哪一个节点上,占用的端口号是哪一个。
将正常的客户端链接断开(用的Storm消费,把Storm的拓扑kill掉就能够了)
再次使用这个命令,就能够查看出,究竟是哪一个程序在捣鬼了。
发如今10.11.2.9节点上,54681这个端口的java程序启动了一个客户端链接。
到10.11.2.9上查看一下是哪一个程序。
命令:netstat -anp | grep 54681 查看占用端口的java进程号是43021。
命令:ps -ef | grep 43021 查看启动这个进程的java程序。
咱们的场景是用Storm来消费RocketMQ。
可是,在咱们kill拓扑的时候,因为storm的缘由,
偶尔会有一些worker不能被kill掉,变成“僵尸进程”
上述问题中,莫名其妙多出的1个客户端链接就是僵尸进程引发的,
将上述发现的僵尸进程kill掉以后,问题就解决了。
Storm的拓扑kill以后,建议检查是否有僵尸进程存在。能够写一个shell脚本检查。