秒杀系统设计方案

秒杀系统设计方案
一,秒杀系统架构设计关键点
1。两个问题,一个备选方案
(1)秒杀其实主要解决两个问题
一个是并发读,并发读的核心理念是尽量减少用户到服务端来“读”数据,或者读更少的数据。
一个是并发写,并发写我们在数据库层面独立出来一个库,做特殊的处理。
(2)还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底案,以防止最坏的情况发生。
2。从架构师的角度来看,要想打造超大流量并发读写,高性能,高可用的系统,我们要遵循几个原则
(1)请求的数据尽量少
(2)请求数尽少
(3)并且不要有单点
3。技术角度上看“稳、准、快”
(1)高性能中高并发访问非常关键,处理方式有以下4点
设计数据的动静分离方案,
热点的发现与隔离,
请求的削峰与分层过滤,
服务端的极致优化,
(2)一致性中商品减库存的实现方式同样关键,主要有以下两种扣减方式
拍下减库存
付款减库存
(3)高可用还要设计一个备选来兜底
二,秒杀系统应该注意的5个原则(结合业务动态平衡)
1。数据要尽量少
(1)用户请求的数据能少就少
用户请求的数据包括,上传给系统的数据和系统返回的数据。用户请求的数据尽量少的原因是,网络上数据传输需要时间,不管是请求数据还是返回数据都需要服务器做处理,服务器在做网络通信都要做压缩和字符编码,这些都非常消耗CPU,所以要减少传输的数据量。
(2)系统依赖的数据能少就少
系统要完成某些业务需要读取和保存数据,一般需要和后台服务及数据库打交道。调用其他服务会涉及数据的系列化和反序列化,而这些也是CPU的一大杀手,同样也会增加延时。数据库本身也容易是一个瓶颈,所以和数据库打交道越少越好,数据越简单,越小则越好。
2。请求数要尽量少
(1)额外请求尽量减少
浏览器每发出一个请求都会有一些消耗,如三次握的手,有的时候页面或者链接数限制,一些请求还需要串行加载等。域名不一样的话,还涉及这些域名的DNS解析,可能会耗时更久。
(2)合并CSS和JavaScript文件
在URL中用逗号隔开,在服务端仍然是单个文件各自存放,服务端自动解析这个URL,合并成一个文件一起返回。
3。路径要尽量短
(1)经过一个节点一般都会产生一个套接字链接
缩短请求路径不仅可以增加可用性,还可以提升性能(序列化,反序列化),减少延时(网络传输耗时)。
(2) RPC调用换成JVM调用
RPC调用换成JVM调用酌情处理。
4。依赖要尽量少
(1)完成一次用户请求必须依赖的系统或者服务尽量减少
若依赖在紧急情况下可以去掉,比如:秒杀页面,这个页面必须强依赖商品信息,用户信息,还有其他优惠券,成交列表这些对秒杀不是非要不可的信息,在紧急情况下可以去掉。
(2)建立系统级别
我们可以给系统进行分级,比如:0级系统,1级系统,2级系统,3级系统,0级系统如果是最重要的系统,那么0级系统强依赖的系统也同样是最重要的系统,以此类推0级系统要尽量减少对1级系统的强依赖,防止重要的系统被不重要的系统拖垮。
5。不要有单点
(1)设计系统最重要的就是消除单点
单点意味着没有备份,风险不可控
(2)避免单点的方案
避免服务和状态绑定,服务无状态化比。如:把机器和相关配置动态化,配置通过配置中心动态推送。
三,不同场景下的不同架构案例
1。比如从1 w/s到了10 w/s的量级
把秒杀系统独立开发,针对性的做优化。系统部署上做机器集群,秒杀流量不会影响正常商品购买。热点数据单独存放在一个独立的缓存系统,提高性能,增加秒杀答的题,防止有秒杀器抢单。
2.100 w/s的请求量级
对页面进行彻底动静分离,使秒杀时不需要刷新整个页面,只需要点击抢宝按钮,把刷新的数据降到最少。服务端对秒杀商品进行本地缓存,不需要调用依赖系统的后台服务获取数据,甚至不需要去公共缓存集群中查询数据,这样不仅可以减少系统调用,而且能够减少公共缓存集群的压力。增加系统限流保护,防止最坏情况发生。
四,动静分离可选方案
1。动态数据和静态数据的定义
动态数据跟访问者相关的个性化数据,静态数据包括存放在硬盘上的html页面,和与访问者无关的由业务处理数据
2。静态数据做缓存的要点
静态数据缓存到离用户最近的地方。可以存在(浏览器,CDN,服务器缓存),
静态化改造(直接缓存http链接,而不是仅仅缓存数据),

秒杀系统设计方案