MQ怎么解决消息堆积的问题
-
网上普通回答
- 修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停止
- 临时建立好原先10倍或者20倍的queue数量
- 然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍数量的queue
- 接着临时征用10倍机器来部署consumer,每一批consumer消费一个临时queue的数据
- 这种做法相当于临时将queue资源和consumer资源扩大了10倍,以正常的10倍速度
但是这种方法远水解决不了进渴
-
用Shovel
- 概念:当某个队列的消费堆积严重时,比如超过某个设定的阀值,就可以通过Shovel将队列消息移交到别的一个集群。
- 当检测到一个队列出现严重的消息堆积的时候,比如可以通过/api/queue/vhost/name接口获取到队列的消息个数超过2000w或者消息的占用大小超过10g的时候,就启用shovel1将队列queue中的消息转发到备份集群的队列queue2。
- 当检测到队列queue的消息个数低于100w的时候或者大小小于1GB就停止shovel1,然后等queue慢慢处理剩余的堆积。
- 当queue的消息个数低于10W或者大小小于100MB时,就开启shovel2将队列queue2中暂存的消息返还给对queue。
- 当检测到队列queue消息个数大于100W或者大小高于1GB就将shovel2停掉。