前言
Hi 你好,我是东东拿铁,95后奶爸程序员。
秒杀的架构设计,在一定程度上非常考验一名后端的系统设计能力,大家也许也都了解过几个关键点,比如缓存、流量削峰、扣库存等,但如果谈起几个关键问题,不知道你能不能对答如流。
- 缓存都有哪几种技术方案,几种方案的优缺点有什么?
- 如何处理热点数据,你的热点数据是怎么区分的?
- 为什么要削峰,削峰你都有哪些方案,用户交互如何处理?
- 扣减库存如何防止不超卖?你是什么时间减库存的,下单,付款,还是预扣?
如果你心中有数,对答如流,请大佬指出本文不足。如果你还有些模糊,或者还有些问题没有想明白,下面我会用一系列专题内容,为大家介绍秒杀。
概述
说起秒杀,我想你肯定不陌生,这两年,从双十一购物到春节抢红包,再到 12306 抢火车票,1499元抢茅台。"秒杀"的场景处处可见。简单来说,秒杀就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是大量的并发读和并发写。
关键点
高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。我会从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤几个方面重点介绍。
一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为"拍下减库存""付款减库存"以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知,扣库存逻辑,也是秒杀的重中之重。
高可用。 在多种优化的架构设计下,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,我们还要考虑 PlanB 来兜底,以便在最坏情况发生时仍然能够从容应对。
架构设计
静态改造
既然是静态改造,先了解一个概念,静态数据。
含义:页面展示的数据,与URL、浏览者、时间、地域都是不相关的,我们可以称为静态数据。
举例
-
媒体新闻类网站,某一个新闻,大家看到都是一样的,其实就是静态数据。
-
打开手淘的时候,阿里之前做了千人千面,所以这个属于动态数据。
静态数据缓存
-
离用户越近,服务压力越小。常见浏览器缓存、CDN,服务器Cache。
-
缓存HTTP连接,Web代理服务器直接根据URL,取出响应头和响应体,直接返回。
-
避免在Java服务器缓存,Servlet容器解析HTTP协议,相比于Web服务器,性能较低。我们常用的Nginx、Varnish更擅长处理大并发静态文件请求。
缓存架构方案
-
实体机部署,使用大容量机器缓存,优势很简单,没有多余交互,也就没有了网络瓶颈。但非常浪费资源,在这个时代其实已经是一个过时架构了。
-
统一Cache层,使用分布式Cache集群。常见的Redis集群,运维成本比实体机简单很多。还有几个优势。
- 多应用接入方便,这个就不多说了,Redis集群,同一个公司都可以用。
- 运维压力低,方便维护。比如针对Redis做一些监控、降级等
- 共享内存,动态扩容。
当然在Cache层也有会网络交换的瓶颈,加入了中间件系统,核心链路加长了。
- CDN。这个方案前端一定不陌生,但这是目前非常主流的方案,下面先简单介绍一下CDN。我个人是后端对这块了解不够多。但CDN常见的几个问题,是必须要考虑的。如失效问题,比如前端因为bug修改代码,必须要让CDN失效。
CDN方案是目前最主流、最常用、表现最佳的方案,其实上CDN,大部分后端程序员一定听过,但其具体原理可能了解较少,因此我重点在介绍下CDN相关内容,当然大家只需要了解原理、了解此方案即可,CDN方案中依然有命中率、发布、失效等一系列问题,不过大多数不需要后端处理。
CDN
CDN是什么
CDN (全称 Content Delivery Network),即内容分发网络
构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN 的关键技术主要有内容存储和分发技术
简单来讲,CDN就是根据用户位置分配最近的资源
于是,用户在上网的时候不用直接访问源站,而是访问离他"最近的"一个 CDN 节点,术语叫边缘节点,其实就是缓存了源站内容的代理服务器。
实现原理
在没有应用CDN时,我们使用域名访问某一个站点时的路径为
用户提交域名→浏览器对域名进行解释→DNS 解析得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复
应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向CDN的全局负载均衡
CNAME实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是CDN实现的关键
CNAME记录,也叫别名记录,比如www.xx.com的别名是www.yy.com,CNAME记录是一种指向关系,把www.yy.com指向了www.xx.com,一个域名可以有多个别名,存在多对一的关系。
负载均衡系统
由于没有返回IP地址,于是本地DNS会向负载均衡系统再发送请求 ,则进入到CDN的全局负载均衡系统进行智能调度:
根据用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点
看用户所在的运营商网络,找相同网络的边缘节点
检查边缘节点的负载情况,找负载较轻的节点
其他,比如节点的"健康状况"、服务能力、带宽、响应时间等
结合上面的因素,得到最合适的边缘节点,然后把这个节点返回给用户,用户就能够就近访问CDN的缓存代理
缓存代理
缓存系统是 CDN 的另一个关键组成部分,缓存系统会有选择地缓存那些最常用的那些资源
其中有两个衡量CDN服务质量的指标:
命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比
缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户
回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,可以有效地减少真正的回源
现在的商业 CDN命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上
注:本文重点介绍和秒杀系统相关的技术方案,CDN的相关部署与运维,还有许多细节和原理是笔者不懂得。如果描述不准确,请大家指出。
总结一下
本想一文来完成介绍秒杀的几个关键点介绍,但在写作过程中,为了大家能够更好的理解各种关键架构设计的内容,内容变长,所以本文只涉及了静态数据改造方案。
也给自己挖个坑,秒杀系列我将会做成一个系列的文章,带大家完整了解秒杀架构的关键技术点与设计思路。
如果本文对你有帮助,欢迎点赞评论,每一个评论我都会认真回答。