问题现象
Rabbitmq线上出现客户端发送消息时报channelMAX. Limit 异常,经过查看管理界面发现:
- 所有连接Channel数量都达到2047,且状态均为unconfirmed。
- 创建的队列状态为NaN,且consumer数量为0。
问题分析
经过查询日志发现,上一个工作日,MQ集群出现了网络抖动导致的网络分区,集群通过自动处理的方式恢复网络分区状态。但是其中某些队列进行主动切换同步过程中出现了异常。问题队列无法正常接受消息进行落盘,所以应用发送消息到这个队列的时候就会发送失败,无法收到服务器回复的confirm,再次发起请求的时候,因为上一次的链接被占用还没有释放,所以就一直重新申请链接,channel数量就不断上升。
解决方法
- 强制关闭问题channel
-
- 强制关闭连接可通过管理平台connection页面直接点击按钮完成
-
- 大多数情况下,channel数过多时,是无法通过页面完成点击的,因为页面直接就卡死了,因此可以在服务器上使用直接请求web api 的方式完成删除操作
curl - i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/connections/{name}
- 大多数情况下,channel数过多时,是无法通过页面完成点击的,因为页面直接就卡死了,因此可以在服务器上使用直接请求web api 的方式完成删除操作
- 强制删除问题队列
rabbitmqctl eval 'Q = {resource, <<"vhostID">>, queue, <<"queueName">>}, rabbit_amqqueue:internal_delete(Q, <<"cli">>).'
参考Investigating Ghost queues on RabbitMQ - 重建队列
最后在原vhost 重建同样规则的队列