如何设计一个秒杀系统
许令波
前阿里巴巴高级技术专家
立即订阅
23218 人已学习
课程目录
已完结 9 讲
开篇词 | 秒杀系统架构设计都有哪些关键点?
免费
01 | 设计秒杀系统时应该注意的5个架构原则
02 | 如何才能做好动静分离?有哪些方案可选?
03 | 二八原则:有针对性地处理好系统的“热点数据”
04 | 流量削峰这事应该怎么做?
05 | 影响性能的因素有哪些?又该如何提高系统的性能?
06 | 秒杀系统“减库存”设计的核心逻辑
07 | 准备Plan B:如何设计兜底方案?
08 | 答疑解惑:缓存失效的策略应该怎么定?
如何设计一个秒杀系统
登录|注册

01 | 设计秒杀系统时应该注意的5个架构原则

许令波 2018-10-01
说起秒杀,我想你肯定不陌生,这两年,从双十一购物到春节抢红包,再到 12306 抢火车票,“秒杀”的场景处处可见。简单来说,秒杀就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是大量的并发读和并发写。
不管是哪一门语言,并发都是程序员们最为头疼的部分。同样,对于一个软件而言也是这样,你可以很快增删改查做出一个秒杀系统,但是要让它支持高并发访问就没那么容易了。比如说,如何让系统面对百万级的请求流量不出故障?如何保证高并发情况下数据的一致性写?完全靠堆服务器来解决吗?这显然不是最好的解决方案。
在我看来,秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。今天,我们就来聊聊,如何在满足一个良好架构的分布式系统基础上,针对秒杀这种业务做到极致的性能改进。

架构原则:“4 要 1 不要”

如果你是一个架构师,你首先要勾勒出一个轮廓,想一想如何构建一个超大流量并发读写、高性能,以及高可用的系统,这其中有哪些要素需要考虑。我把这些要素总结为“4 要 1 不要”。
1. 数据要尽量少
所谓“数据要尽量少”,首先是指用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据(通常就是网页)。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(85)

  • 黄金的太阳
    希望老师可以分别从1W QPS,10W QPS ,100WQPS在架构升级前遇到的性能瓶颈做为讲解入口点,为什么这样设计之后就能解决问题的方式,为什么切分点是1万,10万和100万,瓶颈的分析方式等等,感觉效果更好,否则看到一堆架构,但并不清楚为什么要这样做还是很难平移到自己的系统设计中,一点拙见,希望老师能够解惑

    作者回复: 架构升级的逻辑要具体问题具体分析的
    例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里
    所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案

    2018-10-01
    203
  • Mr.钧👻
    高并发系统的几大方向
    1.请求数据尽量少,从而减少cpu消耗
    2.访问路径尽量短,减少节点消耗
    3.强依赖尽量少,减少加载时间
    4.不要有单点,要有备份
    5.减少额外请求,减少加载时间

    作者回复: 👍

    2018-10-02
    62
  • 小喵喵
    1 .本地cache用什么实现好呢?
    2. 通过什么方式往本地cache 写数据呢?
    3. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?

    作者回复: 1.本地cache一般就是用内存实现,用java集合类型就行
    2.用订阅的方式,在初始化时加载到内存
    3.有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,这个在后面的文章也有介绍

    2018-10-01
    25
  • Edward
    数据缓存在机器内存中的话,集群内如何实现多台机器数据一致性?

    作者回复: 在内存的数据是静态数据,不会更新,没有一致性问题

    2018-10-01
    1
    23
  • 酱了个油
    库存不会放在localcache,localcache只放静态数据。
    库存是放在独立的缓存系统里,如redis,库存是采用主动失效的方式来失效缓存

    作者回复: 👍

    2018-10-09
    13
  • 王永旺
    单点的概念是啥意思,不太明白

    作者回复: 单点就是没有备份,挂了系统没法正常服务了

    2018-10-01
    11
  • 王虹凯
    能不能给一些你认为的关键知识点在文章最后加一些对这些点的外链。这样可以更详细,当然更具系统性。 极客时间也可以考虑这样的一个功能,整个当前专栏共用这些链接。

    当然,作者不加这些也没问题,只是觉得那样是不是更权威些。不过要求作者太多了!

    作者回复: 你想了解那块内容,我可以单独发给你😊

    2018-10-02
    9
  • MeazZa
    请问一下减库存的结果分别是如何更新到公共缓存和本地缓存的呢?

    作者回复: 缓存的更新一般都是没命中时再填充更新

    没命中的原因一种是主动失效,一种是定时失效

    公用缓存主动失效较多,本地缓存,定时失效更常用

    2018-10-01
    9
  • 1024
    阅读5分钟,留言中回复看了半个多小时;感觉从读者讨论中收益更大,许神加油!

    作者回复: 😊

    2018-11-25
    8
  • broken_open
    老师你好,减库存操作,update count = count-1 where count>0,这种做法不会多卖吧?

    作者回复: 😉

    2019-02-15
    6
  • 李海凡
    想了解系统性能和架构升级背后的逻辑是什么,这样设计系统解决了具体什么瓶颈,例如您举的例子中,qps只能到10w、为什么只能到10w,瓶颈在什么地方,如何分析,如何解决

    作者回复: 架构升级的逻辑要具体问题具体分析的

    例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里

    所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案

    2018-10-05
    6
  • 潘政宇
    每经过一个节点,一般都会产生一个新的 Socket 连接。什么意思啊,不是一个tcp连接就有一个socket吗,从客户端到server就是一个tcp连接啊?

    作者回复: 就是每经过一个节点会产生一个新的tcp连接

    2018-10-01
    1
    6
  • Kuer
    老师你好,刚才说要设计时候尽量做到4要1不要,1不要就是不要用单点,也就是因为没有数据备份,想问这个单点和单点登录系统的单点有什么关系吗?希望老师有时间可以解答一下。

    作者回复: 这里的单点有两层含义
    一是本身的系统是单点系统,比如你说的登录系统,所以其他系统需要验证登录状态时都需要调用他,那他就是一个单点,怎么解决?解决的办法就是尽量让这个系统简单,减少更改保持稳定。
    另外一种是状态单点或者叫数据单点,也就是状态一旦丢失比较难恢复,这个就比较麻烦,比如保存登录状态的session保存在一台机器内存中,一旦这台机器挂掉,状态丢失就比较难恢复,这个单点就比较严重

    2018-11-28
    5
  • Lugyedo
    缓存中的热点数据在高并发情况下如何保证一致

    作者回复: 减库存一章会有介绍

    2018-10-01
    5
  • 猎户星座
    请问秒杀的时间是怎么控制的,比如十点开始,十点十分结束。各个客户端、客户端与服务器、以及集群内的服务器之间。时间如何精确同步?

    作者回复: 都是以服务端的时间为准,服务端的时间同步需要依赖一个时间同步组件完成如ntp
    当然当前的服务器时间同步还是有一定的时间延时,但是也不是太影响

    2018-10-01
    4
  • 小黄鸡
    想问下许老师,
    1. 基于canal同步mysql的数据到redis中,如果是更新操作,redis有延时怎么办呢?
    2. 从mysql同步主mysql,如果有延时,怎么办呢?
    这两个问题一直困扰着我
    2019-06-29
    3
  • Seven Blue
    文中讲的原则在后续给出的架构演变例子中,并没有很好的进行说明,看完之后,并没有对此有深刻体会

    作者回复: 😊,可以看看后面的文章,会有更一些详细的介绍

    2018-10-09
    3
  • Mine
    库存cache的更新为什么要通过mq去处理呢,感觉直接在操作数据库之后更新下缓存就可以了啊~ 为什么还要发一条消息呢~

    作者回复: 发消息就是为了更新缓存啊

    2019-04-18
    2
    2
  • xiaoxiangran
    我对秒杀系统有个最大的疑惑,就是从页面发出的请求用同步还是异步?如果用同步的话:1,后端服务必然是分布式的,需要经过多个节点,时间可能会被拉的很长,同时失败的可能性也会增大;2,基于1的情况,会有一个长连接长时间存在,这样随着请求的增多,连接资源越来越少,系统吞吐量会是瓶颈。如果用异步的话:不断的轮询必然会增加系统的请求量,对连接资源也是一种浪费。所以,这应该怎么选择呢?

    作者回复: 各有利弊,就看你最在意什么:)

    2019-03-29
    2
  • 机遇号
    您好,
    关于这个没搞懂。
    把远程过程调用(RPC)变成 JVM 内部之间的方法调用。
    这个怎么解释一下吗

    作者回复: 几句话很难解释清楚,建议看看《大型网站技术架构演进》的合并部署一章有详细的解释

    2019-03-14
    2
收起评论
85
返回
顶部