线上MQ消息堆积了怎么处理?被面试官问麻了

300 阅读2分钟

面试官:我看你简历上有使用RabbitMQ的经历,那你能说说如果现在线上MQ消息大量堆积,需要你处理,你要怎么解决? 小小:把队列删了这样就看不到堆积了。 面试官:好好好,果然是百年难得一遇的天才。 小小:那我面试通过了? 面试官:滚出去! 以上场景根据现实改编,当时的面试官就是我。

—————————————————————————————————————

那么问题来了

线上MQ消息堆积了怎么处理?

这个问题如果直接说增加消费者去做临时扩容,那么很大概率被直接PASS,那么该怎么去回答呢?具体分为这几个步骤:

  1. 先查看服务器日志,是否因为代码问题导致消费异常而堆积,如果是代码问题,把程序员祭天
  2. 如果不存在代码问题,只是消费过慢导致堆积,先临时扩容,增加消费者把线上堆积处理掉
  3. 线上处理完则开始复盘,调整消费逻辑,优化代码,如果是业务线过长原因,则进行业务拆分,保证单条队列的消费效率
  4. 如果存在频繁消息堆积,则可能需要对服务器进行升级,或者进行扩容,提高消费能力
  5. 如果消费者处理能力实在有限,可能需要对生产者进行限流
  6. 根据业务设置合理的超时时间和重试次数
  7. 可以设置监控和报警系统,当队列中的消息堆积达到一定阈值时,及时发出报警通知,以便及时处理。
  8. 合理的业务代码,防止消息重复投递

注:如果业务线过长且无法进行拆分,则需要考虑超时重试问题,如果面临一些无法回滚的业务(例如我们曾因为短信消费超时导致几天内重复发送数十万条短信),一定要做好处理,可在消费前以加锁或其他方式,保证消息不会被重复消费。