削去秒杀场景下的峰值写流量

而在秒杀场景下,高并发的写请求并不是持续的,也不是经常发生的,而只有在秒杀活动开始后的几秒或者十几秒时间内才会存在。为了应对这十几秒的瞬间写高峰,将秒杀请求暂存在消息队列中,然后业务服务器会响应用户“秒杀结果正在计算中”,释放了系统资源之后再处理其它用户的请求。

在后台启动若干个队列处理程序,消费消息队列中的消息,再执行校验库存、下单等逻辑。因为只有有限个队列处理线程在执行,所以落入后端数据库上的并发请求是有限的。而请求是可以在消息队列中被短暂地堆积,当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了。

这就是消息队列在秒杀系统中最主要的作用:削峰填谷,也就是说它可以削平短暂的流量高峰,虽说堆积会造成请求被短暂延迟处理,但是只要时刻监控消息队列中的堆积长度,在堆积量超过一定量时,增加队列处理机数量,来提升消息的处理能力就好了,而且秒杀的用户对于短暂延迟知晓秒杀的结果,也是有一定容忍度的。

这里需要注意一下,所说的是“短暂”延迟,如果长时间没有给用户公示秒杀结果,那么用户可能就会怀疑你的秒杀活动有猫腻了。所以,在使用消息队列应对流量峰值时,需要对队列处理的时间、前端写入流量的大小,数据库处理能力做好评估,然后根据不同的量级来决定部署多少台队列处理程序,这里要根据平均请求时间和商品秒杀总量来计算,设定处理机的数量。

比如你的秒杀商品有1000件,处理一次购买请求的时间是500ms,那么总共就需要500s的时间。这时,你部署10个队列处理程序,那么秒杀请求的处理时间就是50s,也就是说用户需要等待50s才可以看到秒杀的结果,这是可以接受的。这时会并发10个请求到达数据库,并不会对数据库造成很大的压力。

通过异步处理简化秒杀请求中的业务流程

还是刚才的秒杀场景下,我们在处理购买请求时,需要500ms。分析了一下整个的购买流程,发现这里面会有主要的业务逻辑,也会有次要的业务逻辑:比如说,主要的流程是生成订单、扣减库存;次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。

假如发放优惠券的耗时是50ms,增加用户积分的耗时也是50ms,那么如果我们将发放优惠券、增加积分的操作放在另外一个队列处理机中执行,那么整个流程就缩短到了400ms,性能提升了20%,处理这1000件商品的时间就变成了400s。如果我们还是希望能在50s之内看到秒杀结果的话,只需要部署8个队列程序就好了。

解耦实现秒杀系统模块之间松耦合

比如数据团队对你说,在秒杀活动之后想要统计活动的数据,借此来分析活动商品的受欢迎程度等等指标。这时需要将大量的数据发送给数据团队。

一个思路是:可以使用HTTP或者RPC的方式来同步地调用,也就是数据团队这边提供一个接口,我们实时将秒杀的数据推送给它,但是这样调用会有两个问题:

  • 整体系统的耦合性比较强,当数据团队的接口发生故障时,会影响到秒杀系统的可用性。
  • 当数据系统需要新的字段,就要变更接口的参数,那么秒杀系统也要随着一起变更。

这时可以考虑使用消息队列降低业务系统和数据系统的直接耦合度。

秒杀系统产生一条购买数据后,我们可以先把全部数据发送给消息队列,然后数据团队再订阅这个消息队列的话题,这样它们就可以接收到数据,然后再做过滤和处理了。解耦合之后,数据系统的故障就不会影响到秒杀系统了,同时,当数据系统需要新的字段时,只需要解析消息队列中的消息,拿到需要的数据就好了。

高并发系统设计:消息队列的三大作用:削峰填谷、异步处理、模块解耦相关推荐

  1. 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用...

    在消息队列中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺.如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性.但其实可能后面几 ...

  2. 负荷需求响应模型matlab 通过分时电价方式下的负荷需求响应模型得到负荷响应前后变化情况,可以看到明显呈现削峰填谷的作用

    负荷需求响应模型matlab 通过分时电价方式下的负荷需求响应模型得到负荷响应前后变化情况,可以看到明显呈现削峰填谷的作用 YID:6148641310561088爱熬夜的程序猿

  3. 队列处理高并发_高并发架构消息队列面试题解析

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  4. 高并发架构系列:什么是流量削峰?如何解决秒杀业务的削峰场景

    流量削峰的由来 主要是还是来自于互联网的业务场景,例如,马上即将开始的春节火车票抢购,大量的用户需要同一时间去抢购:以及大家熟知的阿里双11秒杀, 短时间上亿的用户涌入,瞬间流量巨大(高并发),比如: ...

  5. 接招吧,最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    接招吧!最强 "高并发" 系统设计 46 连问,分分钟秒杀一众面试者! 谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂 ...

  6. 接招吧!最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂Offer 必不可少的利器!!对于各大公司(比如阿里.腾讯.今日头条等)来说,仅仅懂得CRU ...

  7. 接招吧。最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

    java学习思维导图骆驼祥子思维导图 - GitMind<-- 谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂Offer 必不可少的 ...

  8. 高并发系统设计十六(消息队列削峰)

    在前面章节,我们了解了高并发系统设计的三个目标:性能.可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能.也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧.究其原 ...

  9. 【成为架构师课程系列】高并发系统设计的三大目标:高性能、高可用、可扩展

    系统设计目标 1:如何提升系统性能? 提到互联网系统设计,你可能听到最多的词儿就是 三高,也就是 高并发.高性能.高可用,它们是互联网系统架构设计永恒的主题.在前两节课中,我带你了解了高并发系统设计的 ...

最新文章

  1. 随机挑选分类训练集和测试集
  2. 阿里AI大牛聂再清重返清华,加入张亚勤AIR战队,说“阿里很支持为国家培养人才”...
  3. TensorFlow MNIST初级学习
  4. 统计寄存器AX中1 的个数
  5. Codeforces Round #777 (Div. 2)【未完结】
  6. 120万人同时在线考试,这么大的流量如何支撑
  7. mysql 为什么不能安装_下载的mysql怎么无法安装
  8. 越是糟心时,越要用起写作这个武器
  9. XcodeGhost简单查看
  10. Proteus仿真:存储器
  11. iconfont矢量图标库的引用方法
  12. 用C#写经理评分系统
  13. 解决Elasticsearch集群 master_not_discovered_exception 异常
  14. 人行征信报告介绍(一)
  15. NDT 公式推导及源码解析(1)
  16. Java桌面程序打包全过程
  17. PowerBuilder(PB6)安装过程中的种种问题及解决方式
  18. 解决ipconfig /all一闪即没的问题
  19. 你最喜欢的游戏体验背后有何秘密力量
  20. 编译Android下可执行命令的FFmpeg

热门文章

  1. Android性能优化系列之电量优化
  2. 定制 kali nethunter内核 (官方不支持的手机)
  3. ICC Profile
  4. 【Adrealm智库专栏】数字广告为何需要“去中心化”?
  5. A股全市场个股涨停板明细来袭!—股票数据远程下载服务升级
  6. 中国移动光猫H2-3拨号模式和bridge(桥)模式
  7. 大学学习的期望与目标
  8. Python 使用SMTP协议发送邮件
  9. 网站收录查询,常用的2种网站收录查询方法
  10. 笔记本计算机故障排除,笔记本电脑开机黑屏的原因及故障排除方法