MQ消息积压

场景

几千万条数据在 MQ 里积压了七八个小时,从下午 4 点多,积压到了晚上很晚,10 点多,11 点多。线上故障了,这个时候要不然就是修复 consumer 的问题,让他恢复消费速度,然后傻傻的等待几个小时消费完毕。这个肯定不行。一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条,一分钟是 18 万条,1000 多万条。

所以如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概 1 小时的时间才能恢复过来。

解决方案

这种时候只能操作临时扩容,以更快的速度去消费数据了。具体操作步骤和思路如下:

  1. 先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉。
  2. 临时建立好原先 10 倍或者 20 倍的 queue 数量(新建一个 topic,partition 是原来的 10 倍)。
  3. 然后写一个临时分发消息的 consumer 程序,这个程序部署上去消费积压的消息,消费之后不做耗时处理,直接均匀轮询写入临时建好分 10 数量的 queue 里面。
  4. 紧接着征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的消息。
  5. 这种做法相当于临时将 queue 资源和 consumer 资源扩大 10 倍,以正常速度的 10 倍来消费消息。
  6. 等快速消费完了之后,恢复原来的部署架构,重新用原来的 consumer 机器来消费消息。

09_MQ消息积压.png