秒杀系统设计

参考来源:  极客时间《如何设计一个秒杀系统》

 

1.概述

秒杀系统遇到的问题及解决方法:

并发读:尽量减少用户到服务端来“读”数据,或者让他们读更少的数据

并发写:在数据库层面独立出来一个库,做特殊的处理。设计兜底方案,以防止最坏的情况发生

 

秒杀系统整体架构目标:

:高可用,保证秒杀活动顺利完成。流量符合预期时肯定要稳定,超出预期时也同样不能掉链子。

:保证数据的一致性。例:秒杀 10 台 iPhone,那就只能成交 10 台,多一台少一台都不行。

:高性能。不光是服务端要做极致的性能优化,而且在整个请求链路上都要做协同的优化。

 

秒杀系统整体架构设计概述:

高可用:要保证系统的高可用和正确性,还要设计一个 Plan B来兜底,以便在最坏情况发生时仍然能够从容应对。

一致性:如何设计秒杀减库存方案?减库存又分为“拍下减库存”“付款减库存”以及“预扣”等几种,在大并发更新的过程中要保证数据的准确性。

高性能:数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化。

 

秒杀系统设计5大原则:

1.数据要尽量少

指用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据。

为什么“数据要尽量少”呢?

首先,这些数据在网络上传输需要时间,不管是请求数据还是返回数据都需要服务器做处理,而服务器在写网络时通常都要做压缩和字符编码,这些都非常消耗 CPU。所以减少传输的数据量可以显著减少 CPU 的使用。例如,我们可以简化秒杀页面的大小,去掉不必要的页面装修效果,等等。

其次,要求系统依赖的数据能少就少,调用其他服务会涉及数据的序列化和反序列化,而这也是 CPU 的一大杀手,同样也会增加延时。数据库本身也容易成为一个瓶颈,所以和数据库打交道越少越好,数据越简单、越小则越好。

2.请求数要尽量少

用户请求的页面返回后,浏览器渲染这个页面还要包含其他的额外请求,比如说,这个页面依赖的 CSS/JavaScript、图片,以及 Ajax 请求等等都定义为“额外请求”,这些额外请求应该尽量少。因为浏览器每发出一个请求都多少会有一些消耗,例如建立连接要做三次握手,有的时候有页面依赖或者连接数限制,一些请求(例如 JavaScript)还需要串行加载等。另外,如果不同请求的域名不一样的话,还涉及这些域名的 DNS 解析,可能会耗时更久。所以你要记住的是,减少请求数可以显著减少以上这些因素导致的资源消耗。

例如,减少请求数最常用的一个实践就是合并 CSS 和 JavaScript 文件,把多个 JavaScript 文件合并成一个文件,在 URL 中用逗号隔开(https://g.xxx.com/tm/xx-b/4.0.94/mods/?module-preview/index.xtpl.js,module-jhs/index.xtpl.js,module-focus/index.xtpl.js)。这种方式在服务端仍然是单个文件各自存放,只是服务端会有一个组件解析这个 URL,然后动态把这些文件合并起来一起返回。

3.路径要尽量短

所谓“路径”,就是用户发出请求到返回数据这个过程中,需求经过的中间的节点数。

这些节点可以表示为一个系统或者一个新的 Socket 连接(比如代理服务器只是创建一个新的 Socket 连接来转发请求)。每经过一个节点,一般都会产生一个新的 Socket 连接。每增加一个连接都会增加新的不确定性。缩短请求路径不仅可以增加可用性,同样可以有效提升性能(减少中间节点可以减少数据的序列化与反序列化),并减少延时(可以减少网络传输耗时)。

方法:多个相互强依赖的应用合并部署在一起,把远程过程调用(RPC)变成 JVM 内部之间的方法调用。

4.依赖要尽量少

所谓依赖,指的是要完成一次用户请求必须依赖的系统或者服务,这里的依赖指的是强依赖

例:比如说你要展示秒杀页面,而这个页面必须强依赖商品信息、用户信息,还有其他如优惠券、成交列表等这些对秒杀不是非要不可的信息(弱依赖),这些弱依赖在紧急情况下就可以去掉。

方法:给系统进行分级,比如 0 级系统、1 级系统、2 级系统、3 级系统,0 级系统如果是最重要的系统,那么 0 级系统强依赖的系统同样是最重要的系统,以此类推。

注意:0 级系统要尽量减少对 1 级系统的强依赖,防止重要的系统被不重要的系统拖垮。例如支付系统是 0 级系统,而优惠券是 1 级系统的话,在极端情况下可以把优惠券给降级,防止支付系统被优惠券这个 1 级系统给拖垮。

5.不要有单点

系统中的单点可以说是系统架构上的一个大忌,因为单点意味着没有备份,风险不可控,我们设计分布式系统最重要的原则就是“消除单点”。

方法:避免将服务的状态和机器绑定,即把服务无状态化,这样服务就可以在机器中随意移动。

如何把服务的状态和机器解耦呢?例如把和机器相关的配置动态化,这些参数可以通过配置中心来动态推送,在服务启动时动态拉取下来,我们在这些配置中心设置一些规则来方便地改变这些映射关系。

应用无状态化是有效避免单点的一种方式,但是像存储服务本身很难无状态化,因为数据要存储在磁盘上,本身就要和机器绑定,那么这种场景一般要通过冗余多个备份的方式来解决单点问题。

 

2.淘宝秒杀系统演进

2.1 简单秒杀系统

商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。

2.2 10w/s秒杀系统

随着请求量的加大(比如从 1w/s 到了 10w/s 的量级),简单的架构很快就遇到了瓶颈,因此需要做架构改造来提升系统性能。这些架构改造包括:

1.把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,例如这个独立出来的系统就减少了铺装修的功能,减少了页面的复杂度;

2.在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;

3.将热点数据(如库存数据)单独放到一个缓存系统中,以提高“读性能”;

4.增加秒杀答题,防止有秒杀器抢单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值