高并发系统设计 40 问
唐扬
美图公司技术专家
49013 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
高并发系统设计 40 问
15
15
1.0x
00:00/00:00
登录|注册

17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?

提升系统鲁棒性
降低系统耦合度
提升系统性能
简化业务流程
堆积请求,短暂延迟处理
削平短暂的流量高峰
在什么场景下使用消息队列
引入消息队列会引入新问题,需要新方案解决
解耦合提升系统鲁棒性
异步处理提升系统性能
削峰填谷是消息队列的主要作用
如何减少消息的延迟
如何处理消息的丢失和重复
消息接收顺序对业务流程的影响
处理消息处理失败的情况
减少消息延迟
消息丢失和重复
解耦合
异步处理
削峰填谷
一课一思
课程小结
下一步解决思路
注意事项
消息队列的作用
高并发系统设计中消息队列的作用

该思维导图由 AI 生成,仅供参考

你好,我是唐扬。
在课程一开始,我就带你了解了高并发系统设计的三个目标:性能、可用性和可扩展性,而在提升系统性能方面我们一直关注的是系统的查询性能,也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧。究其原因在于我们遇到的大部分场景都是读多写少,尤其是在一个系统的初级阶段。
比如一个社区的系统初期一定是只有少量的种子用户在生产内容,而大部分的用户都在“围观”别人在说什么。此时,整体的流量比较小,而写流量可能只占整体流量的百分之一,那么即使整体的 QPS 到了 10000 次 / 秒,写请求也只是到了每秒 100 次,如果要对写请求做性能优化,它的性价比确实不太高。
但随着业务发展,你可能会遇到一些存在高并发写请求的场景,其中秒杀抢购就是最典型的场景。假设你的商城策划了一期秒杀活动,活动在第五天的 00:00 开始,仅限前 200 名,那么秒杀即将开始时,后台会显示用户正在疯狂地刷新 APP 或者浏览器来保证自己能够尽量早的看到商品。
这时,你面对的依旧是读请求过高,那么应对的措施有哪些呢?
因为用户查询的是少量的商品数据,属于查询的热点数据,你可以采用缓存策略将请求尽量挡在上层的缓存中,能被静态化的数据(比如商城里的图片和视频数据)尽量做到静态化,这样就可以命中 CDN 节点缓存减少 Web 服务器的查询量和带宽负担。Web 服务器比如 Nginx 可以直接访问分布式缓存节点,从而避免请求到达 Tomcat 等业务服务器。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

消息队列在高并发系统中扮演着重要角色,尤其在处理秒杀场景下的大量写请求时显得尤为关键。本文深入浅出地介绍了消息队列在高并发系统中的重要作用,包括削峰填谷、异步处理和解耦合。作者生动地比喻了消息队列的概念,并指出了消息队列在系统设计中的常见应用场景。在具体讨论中,文章提出了消息队列在秒杀场景中的两大作用:削峰填谷和异步处理,通过将秒杀请求暂存在消息队列中,系统可以有效地应对瞬间的高并发写请求,同时通过异步处理简化了秒杀请求中的业务流程,提升了系统性能。此外,文章还提到了消息队列的作用是解耦合,将秒杀系统和数据系统解耦开,降低了系统的耦合度,提升了整体系统的鲁棒性。然而,引入消息队列也会带来新的问题,需要新的方案来解决,这是系统设计的挑战,也是系统设计独有的魅力。总的来说,本文为读者提供了有益的技术参考,帮助他们了解消息队列在高并发系统设计中的重要作用,以及在开发过程中可能会遇到的挑战和解决思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(45)

  • 最新
  • 精选
  • Victor
    秒杀场景,使用消息队列的话,怎么保证秒杀产品不超卖,这块计算逻辑是怎么处理的?

    作者回复: 其实方法无非有几种: 1. 使用锁的方式,比如分布式锁,也可以利用redis本身操作原子性的特点 2. 写入消息队列,在消息队列中做减库存的操作,做异步校验

    2019-10-28
    23
    44
  • jun.hai
    老师您好,请教个问题:就是前面同学提到的在秒杀场景一下保证产品不超卖方案用redis的原子性特点,那么这个原子性在客户下单的时候用还是支付成功后才能用到?如果客户下单的时候用了redis的原子性减库存了,一旦客户不支付后取消订单了,这时候怎么处理已减掉的库存问题呢?谢谢

    作者回复: 我理解是在下单的时候,如果不支付,一般可以设置一个定时器,定时器时间一到,就把库存加上,同时定义订单失败

    2019-12-04
    2
    31
  • Kean
    比如1000件商品 系统生成1000个令牌 拿到令牌的用户可以进入消息队列,其他未拿到令牌的直接返回已抢完,这种方式是否可以?

    作者回复: 可以的

    2019-11-08
    10
    26
  • 啊啊啊哦哦
    用户如何知道结果轮循查询。还是长连接通知

    作者回复: 轮询查询耗费系统资源。简单的思路是电商系统一般会支持系统通知功能或者私信功能,可以给用户发一个私信:)

    2019-10-28
    10
    21
  • Geek_Lee
    看过很多都是关于设计如何缓存,如何hash一致性分库分表等,,但是没有见过讲解服务容器等需求,,,希望老师能给我解答下,,比如说:10000QPS 需要多少台服务器,,需要多少tomcat类似等容器等 我的理解是 请求最终都会到达容器吧,容器扛不住,,上层设计的完美好像也不能完全解决??? 老师能帮我解答下吗??谢谢

    作者回复: 这个要看业务的复杂度,业务比较轻量的话,单台服务器抗2000qps没有问题,如果因为中有大量io请求,可能也就300-400qps,不能一概而论

    2019-10-29
    4
    11
  • 长期规划
    我理解这个解耦是为了提高整个系统的可用性。是指将业务系统的耦合转为业务系统与消息队列的耦合。即将多个系统的耦合转为对单一系统的耦合,而且这个单一系统没有业务逻辑,只存储。这两点可大大提高系统的可用性。不解耦的话,系统的可用性=A可用性 x B可用性 x C可用性... ,只要一个子系统不可用,整个系统就宕机了。解耦后只有所用子系统都不可用时,整个系统才不可用。

    作者回复: 可以这么理解~

    2019-12-21
    9
  • Bang
    秒杀场景使用了,消息队列,那么前端如何得获得秒杀结果呢? 消息队列的消费者,如何编写比较好, 是一个死循环监听程序吗?

    作者回复: 1. 可以使用产品的功能来通知,比如私信 2. 是的,是一个死循环的程序

    2019-10-28
    2
    7
  • Ricky Fung
    消息队列的应用场景:1.流量削峰(秒杀系统),2.异步处理(非核心流程异步处理 提升效率),3.系统解耦(用户下单后增加积分、通知仓储服务发货)。常用的消息中间件有rabbitmq、kafka、rocketmq。

    作者回复: 赞~

    2019-12-23
    4
    5
  • 阴建锋
    若系统要将所有请求(如:接口的请求与返回报文)的日志入库,如何实现,提高性能且不影响交易?

    作者回复: 一般用类似es的方案?

    2020-03-29
    2
    4
  • 程序水果宝
    消息队列的长度如何设计,以什么为参考?如果请求数量超过了所有消息队列的长度,怎么处理,直接丢弃就可以了吗?

    作者回复: 一般消息队列中间件支持堆积,也就是长度可以非常大。

    2019-10-28
    2
    4
收起评论
显示
设置
留言
45
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部