秒杀系统怎么设计?

什么是秒杀?
“秒杀”是商家在特定时间点进行促销的一种运营手段,体现在系统层面,是指一个Web系统,在一秒钟收到数以万计的用户请求,来抢购数量有限的促销产品 。本质上,秒杀系统就是一个“三高”系统,即高并发、高性能、高可用的分布式系统 。本文主要从“高并发”的角度,来看看需要解决的主要问题 。
秒杀需要处理并发读,并发写 。“并发读”需要通过各种手段减少用户到服务端来读数据,而“并发写”主要需要保证数据的正确性,确保大流量下数据一致 。
秒杀系统关注三方面
下面以一个秒杀系统的例子,来看看一个秒杀系统主要关注的三方面问题 。

秒杀系统怎么设计?

文章插图
 
【秒杀系统怎么设计?】一、高并发访问
秒杀前用户不断刷新页面查看,来获得购买按钮,抢购时集中点击并发购买,核心是对系统数据的高并发读访问,可以通过如下手段进行防护 。
访问拦截:从浏览器/反向代理/Web层/服务层/数据层多层拦截流量,尽量把访问拦截在离用户更近的层,减少对后台的压力;
分流:主要通过分布式集群技术,多台机器处理,提高并发能力;
动静分离:将动态数据和静态数据尽量分离,并通过缓存和CDN等技术对数据读取进行加速;
二、数据正确性
秒杀伴随这一系列业务流程,包括浏览商品、进入抢购页、购买、扣减库存、支付 。其中并发写主要与扣减库存有关,要保证数据的正确性,防止超卖发生 。大概的解决方法有:
减库存:事务判断,热点商品放到单独的热点库,增加并发锁
热点:对核心热点数据进行实时分析,并在系统中进行优化或隔离
异步化:是指把购买请求的接受和处理异步化 。购买请求先放到队列中,这个过程非常高效,返回客户信息 。
限流降级:请求限流,控制系统的访问;对服务的下游依赖进行降级,保证核心链路
三、防作弊
抢购还需要保证公平性,方舟如购票插件购买火车票、黄牛党等 。在技术角度,大概方法有:
答题:为了增加购买的复杂度;延缓请求 。
Cache校验:处理用户购买请求时校验缓存中是否已记录此商品的购买 。
秒杀系统设计原则
1、前台请求数尽量少
前台请求会增加浏览器的负担,尽量简化或合并页面大小(css/JS,图片等),去掉页面装饰;减少DNCS解析
2、后台数据尽量少
后台数据会增加网络传输,压缩和字符编码,消耗CPU 。需要梳理后台依赖的数据和服务,关注序列化/反序列化方式,减少不必要的数据交互
3、调用路径要尽量短
分布式调用错综复杂,需要尽量缩短调用链路;减少第三方依赖,尽量弱依赖,并做好应用分级
4、尽量不要有单点
高可用和稳定性角度,消除单点;服务无状态化,解藕服务状态和机器,如机器配置动态化;有状态的存储,通过冗余备份提高可用性 。
高并发之“访问拦截”
高并发的访问拦截主要思路是:
从浏览器/反向代理/Web层/服务层/数据层多层拦截流量,尽量把访问拦截在离用户更近的层,尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效请求 。同时,用户请求更早的得到处理,也减少了每次请求的RT,进而提高了系统的QPS和并发程度 。
秒杀系统怎么设计?

文章插图
 
浏览器访问拦截
防止用户的不必要的点击,可以在产品层面限制用户的行为,比如点击后按钮不可用,限定时间接受请求 。当然,为了防止恶意抢购,还需要在防作弊上做其他尝试,比如前文讲的答题/cache校验等 。
CDN加速
CDN的全称是Content Delivery Network,即内容分发网络 。简单来讲,就是把原服务器上数据复制到其他服务器上,用户就近访问服务器获取资源 。缺点是内容变更生效慢 。
反向代理访问拦截
主要是动静分离,静态文件作为web项目的一部分进行发布;另外通过Nginx托管静态文件,减轻Web服务的压力 。
Web层和Service层访问拦截
主要是动态数据访问,可以采用缓存的策略,减少对下一层的数据访问 。缓存又可分为本地缓存和redis、memcache等缓存中间件 。
高并发之“分流”
分流主要通过分布式集群技术,多台机器处理,提高并发能力 。


推荐阅读