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

02 | 如何才能做好动静分离?有哪些方案可选?

许令波 2018-10-02
上一篇文章中,我介绍了秒杀系统在架构上要考虑的几个原则,我估计你很快就会问:“知易行难,这些原则应该怎么应用到系统中呢?”别急,从这篇文章开始,我就会逐一介绍秒杀系统的各个关键环节中涉及的关键技术。
今天我们就先来讨论第一个关键点:数据的动静分离。不知道你之前听过这个解决方案吗?不管你有没有听过,我都建议你先停下来思考动静分离的价值。如果你的系统还没有开始应用动静分离的方案,那你也可以想想为什么没有,是之前没有想到,还是说业务体量根本用不着?
不过我可以确信地说,如果你在一个业务飞速发展的公司里,并且你在深度参与公司内类秒杀类系统的架构或者开发工作,那么你迟早会想到动静分离的方案。为什么?很简单,秒杀的场景中,对于系统的要求其实就三个字:快、准、稳
那怎么才能“快”起来呢?我觉得抽象起来讲,就只有两点,一点是提高单次请求的效率,一点是减少没必要的请求。今天我们聊到的“动静分离”其实就是瞄着这个大方向去的。
不知道你是否还记得,最早的秒杀系统其实是要刷新整体页面的,但后来秒杀的时候,你只要点击“刷新抢宝”按钮就够了,这种变化的本质就是动静分离,分离之后,客户端大幅度减少了请求的数据量。这不自然就“快”了吗?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(55)

  • james
    现在不都是前后端分离嘛, 不知道为啥还要将动静分离拿出来说事, 前端页面部署CDN早就标配了, 对于秒杀操作, 没有哪个平台是让用户刷新页面的, 都是到时间后点击按钮来秒杀, 而且这个缓存策略不应该是第一次访问不到再查询缓存, 应该在商家创建完秒杀产品后, 缓存就有了, 如果修改内容, 就直接更新缓存, 秒杀开始后, 商家就不能再修改了, 不想抬杠, 反正我认为这篇文章没啥干货
    2019-02-14
    7
    71
  • 刘晓林
    Hash 分组越少,缓存的命中率肯定就会越高,但短板是也会使单个商品集中在一个分组中,容易导致 Cache 被击穿,所以我们应该适当增加多个相同的分组,来平衡访问热点和命中率的问题。

    老师,我也不是很明白hash分组的多少和命中率之间的关系。命中率不是只和热点数据是否被缓存有关吗,为什么和分组的多少也有关系啊?还有您说的cache分散是什么概念啊?这个问题好像很多人都问到了,看来很多人都不明白,希望老师可以比较详细地解答一下,谢谢老师。

    作者回复: 举个栗子,假如三次访问同一个商品,cache分别有3组,那么如果这3次访问都分别访问不同的3组cache那么是不是3次都没命中。如果只是一组cache的话,那么除了第一次没有命中外,后面两次就命中了。所以cache分组对命中率是不是有影响了。

    2018-10-23
    1
    16
  • 阿毛
    分离时间因素。服务端输出的时间也通过动态请求获取。

    这里的时间为什么也要动态请求呢?

    作者回复: 因为时间要以服务端为准,客户端的时间用户可以自己修改

    2018-10-02
    15
  • 嚴脂红.*
    我想知道老师用的配图都是用什么软件做的呢?

    作者回复: Viso就行啊

    2018-10-04
    12
  • 落叶飞逝的恋
    老师对于目前而言,你讲的架构方面,比如CDN、Nginx这些对于目前我的工作内容而言,涉及不到,哪怕上个新项目,我只要向运维申请机器,其他的不管,也没机会管,那么我如何快速的补充的这些东西,因为上面的讲的内容,可能对于我而言太空洞,应该如何避免?

    作者回复: 只要你想学一定能找到机会,至于如何向别人学习,最简单的一个办法,多和那个同学吃吃饭,一回生二回熟😊

    2018-11-09
    1
    10
  • godtrue
    动静分离的思想暗含着,分而治之和重点把控变化的思维。
    分而治之-几乎所有不能直接解决的问题,都会分割开来,直到比较容易解决为止,学习也类似,把不能理解的知识作分割,直到比较容易理解
    把控变化-管理或者研究事物发展的趋势,就需要重点关注和把控变化的情况,静态的容易处理,所以,变化的就对整体起到了决定性的作用

    对于编程缓存是提高性能的杀手锏,静态资源自然是越靠前越好,动态资源也是越靠前越好,但是需要注意处理好变化的一致性问题

    作者回复: 抽象总结能力很强😉

    2018-11-13
    8
  • Rosso
    CDN二级cache缓存是一个什么概念?是一个CDN上的术语么?百度了一下没怎么查到

    作者回复: 二级cache是指cdn设置了多级回源机制,就是如果缓存没有命中再到二级缓存中去取,而不是直接回服务端来请求
    本质是减少回原的请求量

    2018-10-03
    8
  • A星空之夜
    方案一和方案二中静态页面和动态资源的组装完整页面是在服务端吗?

    作者回复: 理论上都可以,各有优缺点,秒杀推荐在客户端做,普通的商品推荐在服务端做

    2018-10-02
    5
  • Hana
    对于浏览器端的动静分离,疑问
    问题一:动静数据在服务器端合成的话,是用什么怎么合成的?

    而对于app原生开发的话
    问题二:商品详情返回动静数据都是json格式的,那么在服务端如何合成呢?还是只能前段来分开请求合成?

    作者回复: 动态数据在服务端合成是通过一种叫ESI的技术实现的,例如<esi:src="xx.htm"/>在静态页面中包含这种标签,然后由varnish等软件来解析这种标签,再发起动态请求,把动态请求的结果合成到静态页面中,最终形成一个完整的页面

    服务端生成json格式的目的本身是方便让前端页面渲染时容易使用这些数据。可以把这些json数据在服务端合成一起输出,也可以在浏览器里单独发一个ajax请求再异步获取都可以

    2018-10-20
    3
  • 他城之途
    看评论,很多人被老师的“缓存命中率”整懵了,我觉得老师把“命中率”改成“利用率”可能会更好避免误解,老师的意思是分组多了,单个分组的“利用率”就低了。但在很多人的概念里,“命中率”是指缓存打中率,跟第一次和失效有关。

    作者回复: 😉,在单独的qa文章中有介绍

    2018-11-04
    1
    2
  • func
    没明白老师数的这个意思指的是?Cache层是web缓存可以直接缓存http请求,例如varnish?web缓存,缓存http请求?缓存的是请求后返回的数据?如果是同一个http请求就不会走到 redis cache了?

    作者回复: 你可以了解一下varnish的原理

    2018-10-08
    2
  • 小喵喵
    缓存失效了怎么办呢?文中没有给出答案,请指导一下。

    作者回复: 失效需要一个失效系统来实现,一般有主动失效和被动失效
    主动失效需要监控数据库数据的变化然后转成消息来发送失效消息,这个实现比较复杂,阿里有个系统叫metaq,大家可以去网上查查

    被动失效就是只缓存固定时间,然后到期后自动失效

    2018-10-02
    2
  • sgl
    想问一下,方案一和方案二里的cahe层,还有一个缓存,缓存是什么?

    作者回复: Cache层是web缓存可以直接缓存http请求,例如varnish

    另外一个缓存就是redis这种

    2018-10-02
    2
  • 杨晓维
    所以到这边还没有用到Redis吗?
    2019-07-17
    1
  • ~~
    老师您好,我想请问统一Cache中所说到的: 不同系统之间的内存可以动态切换,具体是指什么情况呢?

    作者回复: 就是一个大的cache,存放了不同的内容,可以调整存的比例

    2019-04-24
    1
  • 威猛小茂然
    写的挺不错的
    2019-03-13
    1
  • 不似旧日
    最近面试经常问道如何设计一个秒杀系统,感觉这个专栏不适合面试,适合实操

    作者回复: 🙂

    2019-02-21
    1
  • 🐻两脚兽จุ๊บ。
    许大大你好. 今天看了您这篇动静分离的干货, 受益匪浅. 想请教个问题. 方案1里面提到的把通常只需要虚拟机或者容器运行的 Java 应用换成实体机, 并且列出了实体机的几个优点. 这里面还是不大懂实体机相对于虚拟机为什么会存在这些差异. 我认为的是: 虚拟机只不过是实体机通过vps软件虚拟化出来的服务器而已, 同等配置的虚拟机跟实体机本质上没什么差别, 为什么会有网络瓶颈, 甚至大内存差别??? 希望得到徐老师的回复.谢谢

    作者回复: 多个虚拟机实际上就是共用一个实体机,所以每个虚拟机能用的资源就是少一些,因为每个虚拟机会竞争整个实体机的资源,例如网络和内存。所以单个实例来讲虚拟机和实体机能用的资源还是有很大差异的

    2019-01-23
    1
  • 黄欢
    请问一致性Hash和提高命中率有什么关系?

    作者回复: 一致性hash可以让相同的请求落在同一台机器上,这样就可以提升cache的命中率了,也可以看看第8节我专门解释了这个问题

    2019-01-18
    1
  • rice
    关于商品详情页缓存在cdn,为何cdn二级缓存的节点少呢?为何不是cdn一级缓存?

    作者回复: 一般情况下,有多级缓存的话,都是二级缓存的节点数少一点,这样能提升二级缓存的命中率。

    选一级缓存也是为了提升命中率

    2018-10-27
    1
收起评论
55
返回
顶部