高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9202 人已学习
课程目录
已更新 38 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后,系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (5讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
高并发系统设计40问
登录|注册

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

唐扬 2019-10-28
你好,我是唐扬。
在课程一开始,我就带你了解了高并发系统设计的三个目标:性能、可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能。也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧。究其原因在于,我们遇到的大部分场景都是读多写少,尤其是在一个系统的初级阶段。
比如说,一个社区的系统初期一定是只有少量的种子用户在生产内容,而大部分的用户都在“围观”别人在说什么。此时,整体的流量比较小,而写流量可能只占整体流量的百分之一,那么即使整体的 QPS 到了 10000 次 / 秒,写请求也只是到了每秒 100 次,如果要对写请求做性能优化,它的性价比确实不太高。
但是,随着业务的发展,你可能会遇到一些存在高并发写请求的场景,其中秒杀抢购就是最典型的场景。假设你的商城策划了一期秒杀活动,活动在第五天的 00:00 开始,仅限前 200 名,那么秒杀即将开始时,后台会显示用户正在疯狂地刷新 APP 或者浏览器来保证自己能够尽量早的看到商品。
这时,你面对的依旧是读请求过高,那么应对的措施有哪些呢?
因为用户查询的是少量的商品数据,属于查询的热点数据,你可以采用缓存策略,将请求尽量挡在上层的缓存中,能被静态化的数据,比如说商城里的图片和视频数据,尽量做到静态化,这样就可以命中 CDN 节点缓存,减少 Web 服务器的查询量和带宽负担。Web 服务器比如 Nginx 可以直接访问分布式缓存节点,这样可以避免请求到达 Tomcat 等业务服务器。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

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

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

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

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

    2019-10-28
    4
    6
  • longslee
    打卡。太棒了,终于来到了消息队列环节。据说,有一种处理秒杀方式,是随机让一部分用户直接失败23333.
    2019-10-28
    4
  • Kean
    比如1000件商品 系统生成1000个令牌 拿到令牌的用户可以进入消息队列,其他未拿到令牌的直接返回已抢完,这种方式是否可以?

    作者回复: 可以的

    2019-11-08
    2
    3
  • 何磊
    请教两个问题:
    1. 由于秒杀数量是有限的,那么假如商品只有1000,队列满1000后,其他请求是否应该直接拒流呢?
    2. 用户请求入队列后,为了及时反馈结果,前端会不断轮训查询结果。查询的读求情也会消耗资源,这部分是采用缓存策略还是结合读写访问不同业务机器来处理呢?
    2019-11-21
    2
  • Geek_Lee
    看过很多都是关于设计如何缓存,如何hash一致性分库分表等,,但是没有见过讲解服务容器等需求,,,希望老师能给我解答下,,比如说:10000QPS 需要多少台服务器,,需要多少tomcat类似等容器等 我的理解是 请求最终都会到达容器吧,容器扛不住,,上层设计的完美好像也不能完全解决??? 老师能帮我解答下吗??谢谢

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

    2019-10-29
    1
    2
  • 撒旦的堕落
    负责过课程建设系统 由于课程对于一家教育网站是属于基础数据 所以课程的修改 比如增加了 一个章 需要通知课程审核系统 作业考试 视频学习 日志记录 在线大学等系统 用消息系统替换了rpc调用 降低了系统的响应时间 降低了系统之间的耦合 提升了系统的可维护性
    2019-10-28
    2
  • SPxiaomin
    秒杀系统消息处理机处理了之后,怎么通知客户端服务的?另外建立个结果队列吗?由客户端轮训拉取?
    2019-11-21
    1
  • 蓝魔丶
    数据同步、消息系统、短信系统、日志系统、事件广播等
    2019-10-29
    1
  • 旅途
    老师,用户是怎么得知结果的呢?
    2019-10-29
    1
  • stg609
    老师,有没有哪节课会介绍下 在分布式高并发"写"的时候,可能遇到的问题及解决思路?
    比如如何既保证数据的正确,又做到高性能? 比如分布式锁的利弊?actor模式的利弊等
    2019-10-28
    1
  • Bang
    秒杀场景使用了,消息队列,那么前端如何得获得秒杀结果呢?
    消息队列的消费者,如何编写比较好, 是一个死循环监听程序吗?

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

    2019-10-28
    1
  • 见哥哥
    解耦,异步,削峰!
    感谢老师的分享,谢谢!

    作者回复: :)

    2019-10-28
    1
  • jun.hai
    老师您好,请教个问题:就是前面同学提到的在秒杀场景一下保证产品不超卖方案用redis的原子性特点,那么这个原子性在客户下单的时候用还是支付成功后才能用到?如果客户下单的时候用了redis的原子性减库存了,一旦客户不支付后取消订单了,这时候怎么处理已减掉的库存问题呢?谢谢
    2019-12-04
  • 布小丫学编程
    为了系统之间的解耦,比如要对订单金额进行统计时。
    异步处理,比如秒杀时,用Redis扣减库存,然后再异步下单,提高并发。
    削峰填谷,对一些高并发的请求,先缓存到队列,然后再使用固定线程池消费,降低服务器压力。
    2019-11-23
  • 海罗沃德
    剛學完李玥老師的消息對列課程,再回過頭來印證今天課程中的問題,體會更深刻
    2019-11-11
  • 云师兄
    在接入层收到请求后写入到消息队列,然后接入层直接返回给了客户端,后续处理结果不需要再经过接入层了吗?像一些网页购物秒杀,具体请求的流程老师可以详细讲一下吗
    2019-11-06
  • 小虎
    言简意赅,非常到位,如果能讲讲如何处理消息丢失和重复就更好了哈哈

    编辑回复: 下一讲等着你🤓🤓🤓🤓

    2019-10-29
  • 👽
    没有消息队列使用经验,谈谈个人理解:
    消息队列的使用的前提:对系统的实时性不是极高,只是短暂的极高并发,不存在持续高并发(持续高并发需要通过其他方式解决)。
    例如:类似于微信报警,需要系统在接到报警信息的瞬间就要弹出报警位置,以及给出相应告警,这种对实时要求极高的业务,就不适用于消息队列。
    反之:各种抢票业务中,则可以用消息队列。抢票与秒杀类似,都是短暂的高并发,不会持续很久。所以可以使用消息队列来解决。
    2019-10-29
  • 程序水果宝
    消息队列的长度如何设计,以什么为参考?如果请求数量超过了所有消息队列的长度,怎么处理,直接丢弃就可以了吗?

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

    2019-10-28
收起评论
21
返回
顶部