02 | 如何才能做好动静分离?有哪些方案可选?
02 | 如何才能做好动静分离?有哪些方案可选?
讲述:秭明
时长16:36大小7.60M
何为动静数据
如何做动静分离的改造
动静分离的几种架构方案
总结一下
赞 22
提建议
精选留言(64)
- james2019-02-14现在不都是前后端分离嘛, 不知道为啥还要将动静分离拿出来说事, 前端页面部署CDN早就标配了, 对于秒杀操作, 没有哪个平台是让用户刷新页面的, 都是到时间后点击按钮来秒杀, 而且这个缓存策略不应该是第一次访问不到再查询缓存, 应该在商家创建完秒杀产品后, 缓存就有了, 如果修改内容, 就直接更新缓存, 秒杀开始后, 商家就不能再修改了, 不想抬杠, 反正我认为这篇文章没啥干货共 20 条评论182
- J.M.Liu2018-10-23Hash 分组越少,缓存的命中率肯定就会越高,但短板是也会使单个商品集中在一个分组中,容易导致 Cache 被击穿,所以我们应该适当增加多个相同的分组,来平衡访问热点和命中率的问题。 老师,我也不是很明白hash分组的多少和命中率之间的关系。命中率不是只和热点数据是否被缓存有关吗,为什么和分组的多少也有关系啊?还有您说的cache分散是什么概念啊?这个问题好像很多人都问到了,看来很多人都不明白,希望老师可以比较详细地解答一下,谢谢老师。展开
作者回复: 举个栗子,假如三次访问同一个商品,cache分别有3组,那么如果这3次访问都分别访问不同的3组cache那么是不是3次都没命中。如果只是一组cache的话,那么除了第一次没有命中外,后面两次就命中了。所以cache分组对命中率是不是有影响了。
共 8 条评论28 - 钱2018-11-13动静分离的思想暗含着,分而治之和重点把控变化的思维。 分而治之-几乎所有不能直接解决的问题,都会分割开来,直到比较容易解决为止,学习也类似,把不能理解的知识作分割,直到比较容易理解 把控变化-管理或者研究事物发展的趋势,就需要重点关注和把控变化的情况,静态的容易处理,所以,变化的就对整体起到了决定性的作用 对于编程缓存是提高性能的杀手锏,静态资源自然是越靠前越好,动态资源也是越靠前越好,但是需要注意处理好变化的一致性问题展开
作者回复: 抽象总结能力很强😉
共 2 条评论21 - 阿毛2018-10-02分离时间因素。服务端输出的时间也通过动态请求获取。 这里的时间为什么也要动态请求呢?
作者回复: 因为时间要以服务端为准,客户端的时间用户可以自己修改
18 - 落叶飞逝的恋2018-11-09老师对于目前而言,你讲的架构方面,比如CDN、Nginx这些对于目前我的工作内容而言,涉及不到,哪怕上个新项目,我只要向运维申请机器,其他的不管,也没机会管,那么我如何快速的补充的这些东西,因为上面的讲的内容,可能对于我而言太空洞,应该如何避免?
作者回复: 只要你想学一定能找到机会,至于如何向别人学习,最简单的一个办法,多和那个同学吃吃饭,一回生二回熟😊
共 3 条评论16 - 嚴脂红.*2018-10-04我想知道老师用的配图都是用什么软件做的呢?
作者回复: Viso就行啊
15 - Rosso2018-10-03CDN二级cache缓存是一个什么概念?是一个CDN上的术语么?百度了一下没怎么查到
作者回复: 二级cache是指cdn设置了多级回源机制,就是如果缓存没有命中再到二级缓存中去取,而不是直接回服务端来请求 本质是减少回原的请求量
13 - Hana2018-10-20对于浏览器端的动静分离,疑问 问题一:动静数据在服务器端合成的话,是用什么怎么合成的? 而对于app原生开发的话 问题二:商品详情返回动静数据都是json格式的,那么在服务端如何合成呢?还是只能前段来分开请求合成?展开
作者回复: 动态数据在服务端合成是通过一种叫ESI的技术实现的,例如<esi:src="xx.htm"/>在静态页面中包含这种标签,然后由varnish等软件来解析这种标签,再发起动态请求,把动态请求的结果合成到静态页面中,最终形成一个完整的页面 服务端生成json格式的目的本身是方便让前端页面渲染时容易使用这些数据。可以把这些json数据在服务端合成一起输出,也可以在浏览器里单独发一个ajax请求再异步获取都可以
共 2 条评论9 - A星空之夜2018-10-02方案一和方案二中静态页面和动态资源的组装完整页面是在服务端吗?
作者回复: 理论上都可以,各有优缺点,秒杀推荐在客户端做,普通的商品推荐在服务端做
6 - 星一2019-11-08我居然看不下去了,感觉很多地方都没有解释明白5
- 杨晓维2019-07-17所以到这边还没有用到Redis吗?共 2 条评论5
- 他城之途2018-11-04看评论,很多人被老师的“缓存命中率”整懵了,我觉得老师把“命中率”改成“利用率”可能会更好避免误解,老师的意思是分组多了,单个分组的“利用率”就低了。但在很多人的概念里,“命中率”是指缓存打中率,跟第一次和失效有关。
作者回复: 😉,在单独的qa文章中有介绍
共 3 条评论4 - sgl2018-10-02想问一下,方案一和方案二里的cahe层,还有一个缓存,缓存是什么?
作者回复: Cache层是web缓存可以直接缓存http请求,例如varnish 另外一个缓存就是redis这种
4 - escray2020-11-19即使不做秒杀系统,也需要做动静分离,但是秒杀系统可能需要把动静分离做到极致。 动静的差别主要是看数据中是否含有和访问者相关的个性化数据,更具体的说就是看,页面的 HTML 源码中是否含有个性化数据。 文中讲的三种动静分离架构方案,似乎的确有时间的影子,但是即使现在也不是每个秒杀系统都需要上 CDN 的,也可能是大家都被云厂商“惯坏了”。 没有做过秒杀系统,很多内容看的也不是很明白,抱着虚心学习的心态。看到留言里面不少“大佬”吐槽,有点好奇。按照资历和经验来看,国内能够超过作者的人可能并不多,但是似乎都自我感觉良好。 其实专栏的主旨并不是手把手教你搭建一个秒杀系统,而是讲秒杀系统的或者说类似的高并发、高性能、数据一致性的系统的设计思路。展开3
- 🐻两脚兽จุ๊บ。2019-01-23许大大你好. 今天看了您这篇动静分离的干货, 受益匪浅. 想请教个问题. 方案1里面提到的把通常只需要虚拟机或者容器运行的 Java 应用换成实体机, 并且列出了实体机的几个优点. 这里面还是不大懂实体机相对于虚拟机为什么会存在这些差异. 我认为的是: 虚拟机只不过是实体机通过vps软件虚拟化出来的服务器而已, 同等配置的虚拟机跟实体机本质上没什么差别, 为什么会有网络瓶颈, 甚至大内存差别??? 希望得到徐老师的回复.谢谢
作者回复: 多个虚拟机实际上就是共用一个实体机,所以每个虚拟机能用的资源就是少一些,因为每个虚拟机会竞争整个实体机的资源,例如网络和内存。所以单个实例来讲虚拟机和实体机能用的资源还是有很大差异的
共 3 条评论3 - 小喵喵2018-10-02缓存失效了怎么办呢?文中没有给出答案,请指导一下。
作者回复: 失效需要一个失效系统来实现,一般有主动失效和被动失效 主动失效需要监控数据库数据的变化然后转成消息来发送失效消息,这个实现比较复杂,阿里有个系统叫metaq,大家可以去网上查查 被动失效就是只缓存固定时间,然后到期后自动失效
3 - 缪文2018-10-02统一cache层,就是类似于redis或者阿里的tair这样的中间件吧?缓存单点怎么解决的?同一个商品的缓存再怎么hash都是落到同一个tair节点的
作者回复: 统一cache层的缓存是web型的缓存,如varnish 缓存单点是通过hash分组,即多个分组缓存一样的内容 Hash分组是通过nginx完成的,一个分组的机器配在nginx的stream里
3 - 小野2019-01-30Cache分组越多,命中率越低能理解。为什么分组越少越容易Cache被击穿呢。按我个人理解,Cache击穿就是同一个Key同一时间大量并发请求因为Cache中没有,都请求到后端系统去了。分组越多还是一样都击穿到后端系统去了啊
作者回复: 正常情况下,你的理解是对的 这里说的问题是,如果一个key访问量过大,到导致单台的cache实例支持不了这么大的访问,从而导致cache失效,然后在把流量直接打到后端服务的情况
共 3 条评论2 - func2018-10-08许老师,架构图中的cache 是通过Varnish缓存的精通数据吗?nginx 也可以实现 为什么要单独加一层这个呢?
作者回复: 主要是性能和稳定性考虑
2 - func2018-10-08没明白老师数的这个意思指的是?Cache层是web缓存可以直接缓存http请求,例如varnish?web缓存,缓存http请求?缓存的是请求后返回的数据?如果是同一个http请求就不会走到 redis cache了?
作者回复: 你可以了解一下varnish的原理
2