如何设计一个秒杀系统
15
15
1.0x
00:00/00:00
登录|注册

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

部署方案
发布更新问题
命中率问题
失效问题
优点
结构图
优点
结构图
去掉Cookie
异步化地域因素
分离时间因素
分离浏览者相关的因素
URL唯一化
静态数据
动态数据
上CDN
统一Cache层
实体机单机部署
如何做动静分离的改造
动静数据
总结一下
动静分离的几种架构方案
数据的动静分离
如何做好动静分离

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

上一篇文章中,我介绍了秒杀系统在架构上要考虑的几个原则,我估计你很快就会问:“知易行难,这些原则应该怎么应用到系统中呢?”别急,从这篇文章开始,我就会逐一介绍秒杀系统的各个关键环节中涉及的关键技术。
今天我们就先来讨论第一个关键点:数据的动静分离。不知道你之前听过这个解决方案吗?不管你有没有听过,我都建议你先停下来思考动静分离的价值。如果你的系统还没有开始应用动静分离的方案,那你也可以想想为什么没有,是之前没有想到,还是说业务体量根本用不着?
不过我可以确信地说,如果你在一个业务飞速发展的公司里,并且你在深度参与公司内类秒杀类系统的架构或者开发工作,那么你迟早会想到动静分离的方案。为什么?很简单,秒杀的场景中,对于系统的要求其实就三个字:快、准、稳
那怎么才能“快”起来呢?我觉得抽象起来讲,就只有两点,一点是提高单次请求的效率,一点是减少没必要的请求。今天我们聊到的“动静分离”其实就是瞄着这个大方向去的。
不知道你是否还记得,最早的秒杀系统其实是要刷新整体页面的,但后来秒杀的时候,你只要点击“刷新抢宝”按钮就够了,这种变化的本质就是动静分离,分离之后,客户端大幅度减少了请求的数据量。这不自然就“快”了吗?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了动静分离的概念及实施方法,以及针对该问题的几种架构方案。首先,文章详细介绍了动静分离的概念,包括将用户请求的数据划分为动态数据和静态数据,并通过对静态数据的缓存来提高访问效率。接着,文章提出了对动态页面进行改造的步骤,包括URL唯一化、分离浏览者相关因素、分离时间因素、异步化地域因素以及去掉Cookie等。此外,文章还介绍了两种处理动态内容的方案:ESI(Edge Side Includes)方案和CSI(Client Side Include)方案。ESI方案在Web代理服务器上做动态内容请求,而CSI方案则是通过单独发起异步JavaScript请求获取动态内容。随后,文章详细阐述了三种架构方案:实体机单机部署、统一Cache层和上CDN,并分别分析了它们的优缺点。最后,文章总结了不同架构方案引入的问题,并强调了在设计架构方案时需要考虑的细节问题。整体而言,本文通过详细的介绍和分析,为读者提供了实现动静分离的思路和架构方案,有助于提高系统的性能和用户体验。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何设计一个秒杀系统》
立即购买
登录 后留言

全部留言(65)

  • 最新
  • 精选
  • J.M.Liu
    Hash 分组越少,缓存的命中率肯定就会越高,但短板是也会使单个商品集中在一个分组中,容易导致 Cache 被击穿,所以我们应该适当增加多个相同的分组,来平衡访问热点和命中率的问题。 老师,我也不是很明白hash分组的多少和命中率之间的关系。命中率不是只和热点数据是否被缓存有关吗,为什么和分组的多少也有关系啊?还有您说的cache分散是什么概念啊?这个问题好像很多人都问到了,看来很多人都不明白,希望老师可以比较详细地解答一下,谢谢老师。

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

    2018-10-23
    8
    28
  • 动静分离的思想暗含着,分而治之和重点把控变化的思维。 分而治之-几乎所有不能直接解决的问题,都会分割开来,直到比较容易解决为止,学习也类似,把不能理解的知识作分割,直到比较容易理解 把控变化-管理或者研究事物发展的趋势,就需要重点关注和把控变化的情况,静态的容易处理,所以,变化的就对整体起到了决定性的作用 对于编程缓存是提高性能的杀手锏,静态资源自然是越靠前越好,动态资源也是越靠前越好,但是需要注意处理好变化的一致性问题

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

    2018-11-13
    2
    21
  • 阿毛
    分离时间因素。服务端输出的时间也通过动态请求获取。 这里的时间为什么也要动态请求呢?

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

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

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

    2018-11-09
    3
    16
  • 嚴脂红.*
    我想知道老师用的配图都是用什么软件做的呢?

    作者回复: Viso就行啊

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

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

    2018-10-03
    13
  • Hana
    对于浏览器端的动静分离,疑问 问题一:动静数据在服务器端合成的话,是用什么怎么合成的? 而对于app原生开发的话 问题二:商品详情返回动静数据都是json格式的,那么在服务端如何合成呢?还是只能前段来分开请求合成?

    作者回复: 动态数据在服务端合成是通过一种叫ESI的技术实现的,例如<esi:src="xx.htm"/>在静态页面中包含这种标签,然后由varnish等软件来解析这种标签,再发起动态请求,把动态请求的结果合成到静态页面中,最终形成一个完整的页面 服务端生成json格式的目的本身是方便让前端页面渲染时容易使用这些数据。可以把这些json数据在服务端合成一起输出,也可以在浏览器里单独发一个ajax请求再异步获取都可以

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

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

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

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

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

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

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