# 《并发设计模式》第60章-半同步半异步模式-如何处理消息堆积问题

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:了解半同步半异步模式的核心原理与使用场景,初步掌握半同步半异步模式的应用场景,掌握半同步半异步模式消息堆积问题的处理方案,能够初步结合自身项目实际场景思考如何将半同步半异步模式灵活应用到自身实际项目中。

大家好,我是冰河~~

半同步半异步模式本质上也使用了消息队列来解耦逻辑,涉及到消息队列的话,我们不得不考虑的一个问题就是:消息堆积问题。产生这种问题的根本原因就是向消息队列中存入数据的速度大于从消息队列中获取数据的速度,造成消息堆积,久而久而,就可能堆满消息队列。

# 一、故事背景

截止到目前,小菜在老王的指导下,不仅分析出了支付系统的性能瓶颈,了解了到底什么是半同步半异步模式,并且基于半同步半异步模式优化了支付系统的逻辑,那现在还有一个问题需要解决:既然半同步半异步模式使用到了消息队列,此时就需要考虑如何处理消息堆积的问题,防止消息队列被填满导致系统性能急剧下降,甚至崩溃宕机。

# 二、问题分析

产生消息堆积问题的根本原因就是向消息队列中存入数据的速度大于从消息队列中获取数据的速度,造成消息堆积,久而久而,就可能堆满消息队列,如图60-1所示。


当异步任务层向消息队列层存入数据的速度,大于同步任务任务层从消息队列层获取数据的速度,就会造成消息的堆积,久而久之,就可能堆满消息队列,严重的话,可能会导致系统性能急剧下降甚至引起系统崩溃宕机。

# 三、解决方案

对于内存队列来说,我们可以对发送短信的系统接口做好压测,评估出一个短信系统发送短信的性能阈值,以此来调整内存队列的大小。在投放使用时,如果感知到内存队列即将堆满消息时,这里,也可以设置一个阈值,内存队列中堆积的消息数量达到阈值时,就延缓异步任务层向消息队列层存入数据的速度。极端情况下,我们也可以丢弃一部分消息,因为像支付成功给用户发送短信,告知其扣费情况和当前余额,只是给用户一个提醒,并不是核心业务。

其他的方案,大家也可以参考《第28章-生产者消费者模式-消息堆积问题解决方案 (opens new window)》的内容,这里不再赘述。

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码