消息队列常见问题

2021/3/17 mq

# 大量消息在 mq 里积压

临时紧急扩容:

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

# mq 中的消息过期失效

批量重导,手写脚本恢复数据

# mq 快写满了

消费一个丢弃一个,快速消费掉所有的消息,手写脚本恢复数据

RocketMQ 的方案

  • 提高消费并行度
  • 批量方式消费
  • 跳过非重要消息
  • 优化每条消息消费过程

# 如何设计一个消息队列

  • 分布式 可伸缩性
  • 持久化
  • 可用性
  • 数据零丢失