# 《Seckill秒杀系统》第78章:消息队列削峰

作者:冰河
星球: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)

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

  • 本章难度:★★☆☆☆
  • 本章重点:理解消息队列削峰的核心原理,重点掌握消息队列在实际项目中的削峰使用方法和注意事项,并能够将其灵活应用到自身实际项目中。

大家好,我是冰河~~

通过削峰技术,可以让流入秒杀系统的流量更加平滑,让秒杀系统在运行过程中更加稳定和可靠。总体上削峰技术可以分成有损削峰和无损削峰。其中,限流是一种有损削峰技术,而打散客户端流量使用的验证码和问答题等,以及使用消息队列削峰都是无损削峰技术。

# 一、前言

一提到消息队列,相信大家第一感觉就是用来做异步处理和削峰填谷的。没错,项目中引入消息队列,主要就是用来做异步处理和削峰填谷。有些消息中间件,例如RocketMQ,还会支持事务消息,可以基于事务消息,在项目中实现分布式事务。在秒杀系统中,引入消息队列中间件,一是可以基于消息队列中间件实现流量削峰,二是可以基于消息队列中间件实现分布式事务。

注意:关于分布式事务有关的内容,大家可以阅读冰河出版的《深入理解分布式事务:原理与实战 (opens new window)》一书。

# 二、本章诉求

讲述消息队列削峰的核心原理,从本质上理解消息队列作为一种无损削峰技术的流程,掌握消息队列在实际项目中的削峰使用方法和注意事项,并能够将其灵活应用到自身实际项目中。

# 三、队列削峰核心原理

消息队列削峰技术是一种能够有效保证下游服务稳定性的无损削峰技术,它能够将超出下游服务范围的流量暂存在消息队列中,由下游服务根据自身的处理能力来决定处理流量数据的速度,这就是通过消息队列进行异步调用、流量削峰的最常见的使用方式。

例如,目前有两个微服务:服务A和服务B,流量相对正常稳定时,服务A可以通过RPC方式调用服务B的接口,当服务A调用的流量比较可控时,并且服务B能够及时处理服务A的调用请求,不会造成太大的延迟,此时是可以满足需求的。这种调用方式也是最简单直接的,其实,大部分微服务之间也是用这种方式进行交互的,如图78-1所示。


服务A通过RPC方式调用服务B时,如果服务A的流量非常高,远远大于了服务B的处理能力,此时服务B的CPU、内存可能会迅速升高,服务B的响应时间也可能会不断升高,最终导致服务B由于无法处理这么高的流量而崩溃宕机。

此时,消息队列就能够应对这种场景了。可以使用消息队列将RPC这种紧耦合的调用方式,改造成两步异步调用,服务A将数据发送到消息队列,服务B从消息队列消费数据进行处理。这样,超过服务B处理能力的流量,就可以暂时存储到消息队列中,服务B可以根据自身的处理能力来决定处理流量的速度。如图78-2所示。

# 查看完整文章

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