面试官:我看你简历上有使用RabbitMQ的经历,那你能说说如果现在线上MQ消息大量堆积,需要你处理,你要怎么解决?
小小:把队列删了这样就看不到堆积了。
面试官:好好好,果然是百年难得一遇的天才。
小小:那我面试通过了?
面试官:滚出去!
以上场景根据现实改编,当时的面试官就是我。
————————————————————————————————————————————————————————
那么问题来了
线上MQ消息堆积了怎么处理?
这个问题如果直接说增加消费者去做临时扩容,那么很大概率被直接PASS,那么该怎么去回答呢?具体分为这几个步骤:
- 先查看服务器日志,是否因为代码问题导致消费异常而堆积,如果是代码问题,把程序员祭天
- 如果不存在代码问题,只是消费过慢导致堆积,先临时扩容,增加消费者把线上堆积处理掉
- 线上处理完则开始复盘,调整消费逻辑,优化代码,如果是业务线过长原因,则进行业务拆分,保证单条队列的消费效率
- 如果存在频繁消息堆积,则可能需要对服务器进行升级,或者进行扩容,提高消费能力
- 如果消费者处理能力实在有限,可能需要对生产者进行限流
- 根据业务设置合理的超时时间和重试次数
- 可以设置监控和报警系统,当队列中的消息堆积达到一定阈值时,及时发出报警通知,以便及时处理。
- 合理的业务代码,防止消息重复投递
注:如果业务线过长且无法进行拆分,则需要考虑超时重试问题,如果面临一些无法回滚的业务(例如我们曾因为短信消费超时导致几天内重复发送数十万条短信),一定要做好处理,可在消费前以加锁或其他方式,保证消息不会被重复消费。