秒杀的场景中,对于系统的要求其实就三个字:快、准、稳。
用户请求的数据(如HTML页面)划分为“动态数据”和“静态数据”,“动态数据”和“静态数据”主要区别就是看页面输出的数据是否和URL、浏览者、时间、地域相关,以及是否含有Cookie等私密数据。 例如:
所谓“动态”和“静态”,并不是说数据本身是否动静,而是数据中是否含有和访问者相关的个性化数据。
分离动静数据之后,就可以对分离出来的静态数据做缓存,有了缓存之后,静态数据的“访问效率”自然得以提高。
常见的缓存方式有:
用户浏览器里、CDN上、服务端Cache中等,一定要视情况而定,缓存到离用户最近的地方!
系统的静态化改造
,静态化改造是直接缓存HTTP连接(不仅仅缓存数据),如下图所示:用户直接请求到Web代理服务器的Http Head与Http Body,把HTTP头和体放到Web代理服务器中,用户可直接获取最近的信息。如Nginx缓存页面。
WEB服务器(如Nginx、Apache、Varnish)更擅长处理大并发的静态文件请求。
示例:
通过Nginx配置静态文件加载(待补充)
.htm/id=?
,在缓存整个HTTP连接时,URL就可以作为Key(即.htm
),然后以id=?来区分
。示例:
服务端输出的时间也通过动态请求获取。
例如商品详情中,定位用户位置,或者用户常用位置获取
)通过异步的方式获取,也可以通过动态请求方式获取,推荐使用异步方式获取。unset kie
命令去掉Cookie。注意:这里指的去掉Cookie并不是用户端页面不含Cookie,而是在缓存的静态数据中不含有Cookie。
分离出动态内容后,如何组织使用内容页变得尤为重要。其中很多动态内容都会被页面中的其他模块用到,如判断该用户是否已登陆、用户ID是否匹配等,这个时候我们应该将这些信息JSON化(用JSON格式组织这些数据),以便前端使用。
介绍了用缓存方式来处理静态数据。处理动态内容的方式推荐以下两种:
此方式对服务端性能有影响,但是用户体验较好。
即是对用户对请求路径进行合理架构。根据架构复杂度,分为3种架构可选:实体机单机布署,统一Cache层,上CDN;
将虚拟机替换为实体机,增大Cache容量,并采用一致性Hash分组方式提升命中率。将Cache分组对目的是为了提供命中率及访问热点对平衡。Hash分组越少,缓存命中率越高,短板是单个商品集中一个分组时,容易导致Cache被击穿,通过适当增加多个相同分组,平衡访问热点和命中率的问题。
实体机单机布署方案结构图 (Nginx + Cache + Java) :
这个方案中,将虚拟机或者容器运行的Java应用换成实体机,优点是增加单机的内存容量,缺点则是在一定程度下会造成CPU的浪费,因为单个JAVA进程很难用完整个实体机的CPU。
另外,一个实体机上布署来Java应用有作为Cache来使用,运维成本难度会提高,所以这个方案属于一个这种方案,当公司内部只有一个秒杀业务时,我们可以选择这样布署,但是,如果涉及多个类似业务,我们应该把Cache和应用单独分离,把Cahce层抽离公用比较合理,即下面要介绍的统一Cache层。
将单机的Cache统一分离出来,形成一个单独的Cache集群 (推荐)
。 该方案结构图如下所示:
Cache统一,降低运维成本,并且方便接入其它动态化系统。此外,它的其他优点:
优点 | 描述 |
---|---|
独立Cache层 | Cache层公用,Java应用值关系本身业务,调用公用Cache即可。 |
易于维护 | 统一管理,配合监控、自动化配置等功能让独立Cache层可以高效工作。 |
内存共享 | 最大化利用内存,多系统之间内存可以动态切换,从而能够有效应对各种攻击。 |
此方案降低了维护成本(运维和集群设计),可依然有自己的缺点:
缺点 |
---|
Cache 层内部交换网络成为瓶颈 |
缓存服务器网卡也会是瓶颈 |
机器少风险大,挂掉一台就会影响很大一部分缓存数据 |
要解决上面的问题,可在对Cache做Hash分组,即一组Cache缓存的内容相同,这样能够避免热点数据过度集中导致新的瓶颈产生。
动静分离是离用户越近,效果会越好,将Cache放到离用户更近的CDN上,是进一步的优化方案,做到这点需要先解决以下的问题:
失效问题
缓存在CDN上的时效要可控到秒级,以便让分布在全国各地的Cache同时失效,对CDN的失效系统要求较高
示例:
如何做到CDN Cache失效?
命中率问题
Cache最重要的一个衡量指标就是“高命中率”,不然Cache的存在就失去了意义。同样,如果将数据全部放到全国到CDN上,必然导致Cache分散,而Cache分散又会导致访问请求命中同一个Cache的可能性降低,固然命中率就会成为问题。
发布更新问题
业务模块迭代更新较快,发布系统就要变得简洁高效,并且要考虑有问题时,如何混滚和排查问题。
从上面的分析看,将商品详情系统放到全国的CDN节点并不现实,因为存在失效问题、命中率问题以及系统发布更新问题,那是否可以选择若干个节点尝试实施呢?“可以”,但是节点需要满足以下5个因素:
因素 |
---|
靠近访问量比较集中的地址; |
离主站相对较远; |
节点到主站间网络比较好,而且稳定; |
节点容量比较大,不会占用其他CDN太多资源; |
节点不能太多 ; |
基于上面的这些因素,选择CDN的二级Cache
比较合适,因为 二级Cache数量偏少,容量更大
,用户请求先回源(什么叫CDN回源)到CDN的二级Cache中,如果没命中再回源站获取数据,布署方式如下图所示:
使用CDN的二级Cache作为缓存,可达到与当前服务端静态化Cache类似的命中率,因为节点数不多,Cache不是分散的,访问量也比较集中,这样就解决来命中率问题。
除此之外,CDN化还有以下几个特点:
这样将90%的静态数据缓存在用户端或CDN上,秒杀启动时,用户实际只需要点击特殊的“刷新抢宝”按钮,而不需要刷新整个页面。
本文发布于:2024-02-01 09:44:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675185835749.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |