本文环境 Windows11\ 不懂的可以评论或联系我邮箱:owen@owenzhang.com\ 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最近学习的一门课程,记录下学习笔记
感兴趣的朋友可以去购买,课程地址:如何设计一个秒杀系统 (geekbang.org)
本文会一直更新修改,因为一天看一点学一点,嘻嘻,:)
从技术角度上看“稳、准、快”,就对应了我们架构上的高可用、一致性和高性能的要求:
秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。
数据要尽量少、请求数要尽量少、路径要尽量短、依赖要尽量少,以及不要有单点。
架构是一种平衡的艺术,而最好的架构一旦脱离了它所适应的场景,一切都将是空谈。
如果你想快速搭建一个简单的秒杀系统,只需要把你的商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。这就是当时第一个版本的秒杀系统实现方式。
动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和 URL、浏览者、时间、地域相关,以及是否含有 Cookie 等私密数据。
静态数据,不能仅仅理解为传统意义上完全存在磁盘上的 HTML 页面,它也可能是经过 Java 系统产生的页面,但是它输出的页面本身不包含上面所说的那些因素。也就是所谓“动态”还是“静态”,并不是说数据本身是否动静,而是数据中是否含有和访问者相关的个性化数据。
页面中“不包含”,指的是“页面的 HTML 源码中不含有”,这一点务必要清楚。
怎样对静态数据做缓存呢?
第一,你应该把静态数据缓存到离用户最近的地方。
第二,静态化改造就是要直接缓存 HTTP 连接。
第三,让谁来缓存静态数据也很重要。不同语言写的 Cache 软件处理缓存数据的效率也各不相同。
5 个方面来分离出动态内容:
1.URL 唯一化。
2.分离浏览者相关的因素。
3.分离时间因素。
4.异步化地域因素。
5.去掉 Cookie。
动态内容的处理通常有两种方案:ESI(Edge Side Includes)方案和 CSI(Client Side Include)方案。
实体机单机部署;统一 Cache 层;上 CDN。
Hash 分组越少,缓存的命中率肯定就会越高,但短板是也会使单个商品集中在一个分组中,容易导致 Cache 被击穿,所以我们应该适当增加多个相同的分组,来平衡访问热点和命中率的问题。
将 Cache 层单独拿出来统一管理可以减少运维成本,同时也方便接入其他静态化系统。
对 Cache 做 Hash 分组,即一组 Cache 缓存的内容相同,这样能够避免热点数据过度集中导致新的瓶颈产生。
Cache 进一步前移到 CDN 上,因为 CDN 离用户最近,效果会更好。
将商品详情系统放到全国的所有 CDN 节点上是不太现实的,因为存在失效问题、命中率问题以及系统的发布更新问题。
可以选择若干个节点来尝试实施。这样的节点需要满足几个条件:
靠近访问量比较集中的地区;离主站相对较远;节点到主站间的网络比较好,而且稳定;节点容量比较大,不会占用其他 CDN 太多的资源。节点不要太多。
因为在 CDN 上,我们可以做主动失效,而在用户的浏览器里就更不可控,如果用户不主动刷新的话,你很难主动地把消息推送给用户的浏览器。
二级cache是指cdn设置了多级回源机制,就是如果缓存没有命中再到二级缓存中去取,而不是直接回服务端来请求
Cache层是web缓存可以直接缓存http请求,例如varnish
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。