什么是秒杀?秒杀就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是大量的并发读和并发写。
秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。
架构原则:4要1不要。
1.数据尽量少
用户完成一次交易所需要在网络上交换的数据量应尽可能少。这既包括客户端与服务端的数据交换,也包括服务端内部的数据交换。这是因为数据在网络上传输需要消耗带宽,也需要时间;数据的序列化、压缩、发送、接收、解压缩都需要消耗CPU。
具体措施举例:
- 尽量精简页面,去掉不必要的装饰。
2.请求数尽量少
具体措施举例:
- 合并CSS和JavaScript文件。
3.路径尽量短
客户端与服务端通信过程中,需要经过的节点数应尽量少。
通常,这些节点可以表示为一个系统或者一个新的 Socket 连接(比如代理服务器只是创建一个新的 Socket 连接来转发请求)。每经过一个节点,一般都会产生一个新的 Socket 连接。每增加一个连接都会增加新的不确定性。所以缩短请求路径不仅可以增加可用性,同样可以有效提升性能(减少中间节点可以减少数据的序列化与反序列化),并减少延时(可以减少网络传输耗时)。
具体措施举例:
- 多个相互强依赖的应用合并部署在一起,把远程过程调用(RPC)变成 JVM 内部之间的方法调用(反微服务)。
4.依赖尽量少
所谓依赖,指的是要完成一次用户请求必须依赖的系统或者服务,这里的依赖指的是强依赖。
举个例子,比如说你要展示秒杀页面,而这个页面必须强依赖商品信息、用户信息,还有其他如优惠券、成交列表等这些对秒杀不是非要不可的信息(弱依赖),这些弱依赖在紧急情况下就可以去掉。
要减少依赖,我们可以给系统进行分级,比如 0 级系统、1 级系统、2 级系统、3 级系统,0 级系统如果是最重要的系统,那么 0 级系统强依赖的系统也同样是最重要的系统,以此类推。5.不要有单点
那如何避免单点呢?我认为关键点是避免将服务的状态和机器绑定,即把服务无状态化,这样服务就可以在机器中随意移动。
应用无状态化是有效避免单点的一种方式,但是像存储服务本身很难无状态化,因为数据要存储在磁盘上,本身就要和机器绑定,那么这种场景一般要通过冗余多个备份的方式来解决单点问题。
