1.问题排查
做活动需求,用到rabbitMq接受上游业务的订单消息;上线一个月之后线上mq突发消息队列堵塞;查看consumer日志,发现服务已经2天没有消费,诡异的是所有的consumer使用的同一个exchange,但只有这条队列堵塞,到测试环境手动发消息,正常消费,无法复现。重启线上服务器,consumer开始消费,但是没过多久,都停止消费了。之后反复查看代码,代码中其中一个分支存在重复ack的可能,翻看文档发现
之后查看消息堵塞时服务器error日志, 的确有channel closed的异常,问题应该就是出在这里,但是为什么测试环境没有问题呢?
2. 问题复现
测试环境无法复现,可能是因为数据量不够大的原因,于是打算在dev环境手动先压进10000条数据进queue;然后启动consumer服务,开始消费。果不其然,当队列消费了500条数据之后,便抛出channel closed异常,queue中的队列不在被消费
3.总结
使用rabbitMq,在数据量大的情况下,重复ack会发生channel closed,consumer停止消费,从而导致queue堵塞。