在8月5、6、7连续三天晚上10点出现充值相关几个消息堆积的问题,经过分析发现主要问题是充值项目对mq的使用存在一些不合理的地方,当mq负载高时会出现堆积现象。

具体原因如下:

   1、采用的消息模式是get模式,而不是高效的deliver模式,经过在新搭建的mq服务器测试发现,get模式:5000条/秒便会出现严重堆积, deliver模式:20000条/秒不会堆积,如果按照充值项目的写法由于存在后续的问题,每秒几百条的写入就会经常出现消息堆积;

  2、消息的生产和消费共用mq链接和channel

     a)    共用链接会导致:当触发mq的限流控制时,阻塞消费;

     b)    mq的客户端channel实现为避免消息乱窜会大量加lock,把并行变为串行,当写阻塞时,相当于也阻塞了读,相反一样。

 3、不同队列共用链接和channel,会出现队列相互影响的问题。


以上问题是相关技术人员对rabbitmq不了解,采用了get模式,并且希望封装一个连接池,结果封装的有问题导致队列和消息之间相互影响,从而把一个火箭变成了一只蜗牛。


严重建议使用deliver模式。