秒杀系统设计方案
1、秒杀系统架构设计关键点
1.两个问题,一个备选方案
(1)秒杀其实主要解决两个问题
一个是并发读,并发读的核心理念是尽可能减小用户到服务端来“读”数据,或者读更少的数据。
一个是并发写,并发写咱们在数据库层面独立出来一个库,作特殊的处理。
(2)还要针对秒杀系统作一些保护,针对意料以外的状况设计兜底案,以防止最坏的状况发生。
2.从架构师的角度来看,要想打造超大流量并发读写、高性能、高可用的系统,咱们要遵循几个原则
(1)请求的数据尽可能少
(2)请求数尽少
(3)而且不要有单点
3.技术角度上看“稳、准、快”
(1)高性能中高并发访问很是关键,处理方式有如下4点
设计数据的动静分离方案、
热点的发现与隔离、
请求的削峰与分层过滤、
服务端的极致优化、
(2)一致性中商品减库存的实现方式一样关键,主要有如下两种扣减方式
拍下减库存
付款减库存
(3)高可用还要设计一个备选来兜底
2、秒杀系统应该注意的5个原则(结合业务动态平衡)
1.数据要尽可能少
(1)用户请求的数据能少就少
用户请求的数据包括,上传给系统的数据和系统返回的数据。用户请求的数据尽可能少的缘由是,网络上数据传输须要时间,不论是请求数据仍是返回数据都须要服务器作处理,服务器在作网络通讯都要作压缩和字符编码,这些都很是消耗CPU,因此要减小传输的数据量。
(2)系统依赖的数据能少就少
系统要完成某些业务须要读取和保存数据,通常须要和后台服务及数据库打交道。调用其余服务会涉及数据的系列化和反序列化,而这些也是CPU的一大杀手,一样也会增长延时。数据库自己也容易是一个瓶颈,因此和数据库打交道越少越好,数据越简单、越小则越好。
2.请求数要尽可能少
(1)额外请求尽可能减小
浏览器每发出一个请求都会有一些消耗,如三次握手,有的时候页面或者连接数限制,一些请求还须要串行加载等。域名不同的话,还涉及这些域名的DNS解析,可能会耗时更久。
(2)合并CSS和JavaScript文件
在URL中用逗号隔开,在服务端仍然是单个文件各自存放,服务端自动解析这个URL,合并成一个文件一块儿返回。
3.路径要尽可能短
(1)通过一个节点通常都会产生一个socket连接
缩短请求路径不只能够增长可用性,还能够提高性能(序列化、反序列化),减小延时(网络传输耗时)。
(2)RPC调用换成JVM调用
RPC调用换成JVM调用酌情处理。
4.依赖要尽可能少
(1)完成一次用户请求必须依赖的系统或者服务尽可能减小
若依赖在紧急状况下能够去掉,好比:秒杀页面,这个页面必须强依赖商品信息、用户信息,还有其余优惠券、成交列表这些对秒杀不是非要不可的信息,在紧急状况下能够去掉。
(2)创建系统级别
咱们能够给系统进行分级,好比:0 级系统、1 级系统、2 级系统、3 级系统,0 级系统若是是最重要的系统,那么 0 级系统强依赖的系统也一样是最重要的系统,以此类推。0 级系统要尽可能减小对 1 级系统的强依赖,防止重要的系统被不重要的系统拖垮。
5.不要有单点
(1)设计系统最重要的就是消除单点
单点意味着没有备份,风险不可控
(2)避免单点的方案
避免服务和状态绑定,服务无状态化。好比:把机器和相关配置动态化,配置经过配置中心动态推送。
3、不一样场景下的不一样架构案例
1.好比从 1w/s 到了 10w/s 的量级
把秒杀系统独立开发,针对性的作优化。系统部署上作机器集群,秒杀流量不会影响正常商品购买。热点数据单独存放在一个独立的缓存系统,提升性能。增长秒杀答题,防止有秒杀器抢单。
2.100w/s的请求量级
对页面进行完全动静分离,使秒杀时不须要刷新整个页面,只须要点击抢宝按钮,把刷新的数据降到最少。服务端对秒杀商品进行本地缓存,不须要调用依赖系统的后台服务获取数据,甚至不须要去公共缓存集群中查询数据,这样不只能够减小系统调用,并且可以减小公共缓存集群的压力。增长系统限流保护,防止最坏状况发生。
4、动静分离可选方案
1.动态数据和静态数据的定义
动态数据跟访问者相关的个性化数据,静态数据包括存放在硬盘上的html页面,和与访问者无关的由业务处理数据
2.静态数据作缓存的要点
静态数据缓存到离用户最近的地方。能够存在(浏览器、CDN、服务器Cache),
静态化改造(直接缓存http连接,而不是仅仅缓存数据),
Web服务器直接缓存静态数据(nginx、apache)。
3.动静分离5个方面
URL惟一化(分区保存)
分离浏览者相关因素(是否登陆、登陆身份等,经过动态请求获取)
分离时间因素(服务器输出时间经过动态请求获取)
异步化地域因素(经过异步获取地域相关信息)
去掉Cookie,静态页面不含cookie(经过代码软件删除)
4.静态数据和动态数据组装
在代理服务器上作动态数据请求,并将动态数据插入到静态页面中
浏览器发起动态请求,浏览器进行页面组装
5.动静分离的几种架构方案
实体机单机部署
统一cache
上CDN(有几个问题:1,失效问题;2,命中率问题;3,发布更新问题;)
5、针对性地处理好系统“热点数据”二八原则
1.热点数据处理
(1)发现静态热点数据的方式
经过报名方式筛选热点商品,后台系统对热点数据进行预处理。
系统预测,系统天天排除top N的商品,后台系统对热点数据进行预处理。
(2)发现动态热点数据的方式
构建一个异步系统,它能够收集交易链路上的各个环节中的中间件产品的热点key,如Nginx、缓存、RPC服务框架等这些中间件。
创建一个热点上报和能够按照需求订阅的热点服务的下发规范,主要目的是经过交易链路上各个系统访问的时间差,把上游系统已经发现的热点同传给下游系统,提早作好保护。
将上游系统收集的热点数据发送到热点服务器,而后下游系统作热点保护。
2.打造热点发现系统注意事项
热点服务后台抓取数据日志采用异步方式
热点服务发现和中间件的热点保护模块并存
热点发下要作到接近实时
3.处理热点数据
(1)优化热点数据
优化热点数据最有效的方法就是缓存热点数据,缓存数据能够用LRU淘汰算法替换。
(2)限制
根据商品id作一致性Hash,放入不一样的队列中,防止因某些商品占用太多的服务。
(3)隔离
将这种热点数据隔离出来,不让1%的请求影响到另外99%的请求。
隔离有如下几个层次,业务隔离、系统隔离、数据隔离
6、流量削峰方案
1.排队
把一步的操做变成两步的操做,增长一步起到缓冲的做用。
2.答题
防止部分秒杀器做弊
延缓请求,请求量削峰
3.分层过滤
将动态请求的读数据缓存在web端,过滤掉无效数据;
读数据不作强一致校验;
对写数据进行基于时间的合理分片,过滤掉过时的失效请求;
对写请求作限流保护,将超出系统承载能力的请求过滤掉;
对写数据进行强一致校验,只保留最后有效数据;
7、提升系统性能方案
1.影响性能的因素(服务器性能通常用QPS来衡量)
(1)一次响应的服务端耗时,对性能有影响的是CPU的执行时间
(2)处理请求的线程数,合理的并发线程数
8、减库存设计核心逻辑
1.减库存的3种方式,以及可能存在的问题
(1)下单减库存,下单不付款(大型秒杀系统通常使用下单减库存)
(2)付款减库存,库存超卖
(3)预扣库存(下单后库存保留必定时间)
2.秒杀减库存的极致优化
(1)秒杀商品的减库存逻辑很是单一,能够再缓存系统完成扣减
(2)比较复杂的库存扣减逻辑,要在数据库中完成扣减
9、备选方案的设计
1.高可用建设应该从哪里着手
(1)架构阶段
主要考虑可扩展性和容错性,避免出现单机
(2)编码阶段
主要考虑代码的健壮性,涉及远程调用要设置合理的超时退出
也要对调用的返回结果集有预期,防止返回的结果超出程序处理的范围
(3)测试阶段
保证测试用例的覆盖度
保证最坏的状况发生时,有相应的处理流程
(4)发布阶段
要有紧急的回滚机制
(5)运行阶段
对系统的监控要准确及时
发现问题能准确报警,数据要准确详细,以便排查问题
(6)故障发生
及时止损
及时恢复,并定位缘由解决问题html