这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战
前言
现在在我们的生活中,处处都有“秒杀”的场景,从我们的双十一购物到12306抢火车票。那么我们就来探究秒杀系统的设计吧,首先我们要明白秒杀系统的本质概念。
秒杀:就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是有大量的并发读和并发写。秒杀系统的本质就是一个满足大并发,高性能和高可用的分布式系统。
那么我们在设计一个超大流量并发读写,高性能以及高可用的性能,需要考虑的一些要素:
考虑要素
数量要尽量少
“数量要尽量少”指的就是用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据(通常是网页)。数据量少可以减少数据在网络上传输的时间,不管是请求数据还是返回数据都是需要服务器进行处理的,数据在计算机系统中都是在总线接口(系统总线,内存总线,I/O总线)上不停的来回传输做复制操作,这些都是非常消耗CPU,减少传输的数据量可以减少CPU的使用。简化秒杀页面,去掉不必要的动态效果等。
与系统依赖的数据能少就少,比如要完成某些业务逻辑需要读取和保存的数据,这些数据一般是和后台服务以及数据库打交道的。调用其他服务会涉及数据的序列化和反序列化也会消耗CPU,增加延时。而且,数据库本身也容易成为一个瓶颈,所以和数据库打交道越少越好,数据越简单、越小则越好。
请求数尽量少
用户请求的页面返回后,浏览器渲染页面还需要包含其他的额外请求,比如说,这个页面依赖的 CSS/JavaScript、图片,以及 Ajax 请求等等都定义为“额外请求”,这些额外请求应该尽量少。因为浏览器每发出一个请求都会有多个消耗,例如建立连接要做三次握手。
路径要尽量短
所谓“路径”,就是用户发出请求到返回数据这个过程中,需求经过的中间的节点数。通常,这些节点可以表示为一个系统或者一个新的 Socket 连接(比如代理服务器只是创建一个新的 Socket 连接来转发请求)。每经过一个节点,一般都会产生一个新的 Socket 连接。所以缩短请求路径不仅可以增加可用性,同样可以有效提升性能(减少中间节点可以减少数据的序列化与反序列化),并减少延时(可以减少网络传输耗时)。
不要有单点
在用户量不大的时代,我们所开发的系统还是单点系统,但是现在用户量激增的时代,单点系统是设计上的一大忌,单点意味着没有备份,风险可控。避免单点的关键点是避免将服务的状态和机器绑定,即把服务无状态化,这样服务就可以在机器中随意移动。
结论
以上就是我们设计一个秒杀系统需要注意的考虑要素。