2020-09-23 秒杀场景分析和功能设计
一、秒杀介绍
从运营角度来说,一般新品上市或者促销商品时会出现秒杀活动,通过一段时间的预热活动,吸引用户的目光,从而达到促销的效果。现在秒杀场景大部分用于电商系统(某宝,某东),在一些传统的项目也会有秒杀的场景比如购买火车票、医院挂号等。
我以前在ToB端的秒杀活动,当时只是简单的进行CRUD,没有进行压测,还出现了库存为负的情况,当用户量大的情况下,需要保证系统能正常运行,并且库存数量正确。
二、秒杀的业务分析
我们都参加过秒杀的活动,从产品的角度来分析秒杀的场景特点,从而设计出好的系统
1、价格低廉
2、大幅推广,提前预热
3、顺势售空
4、定时开始
5、瞬时高并发(区别于高并发)
三 秒杀技术分析
1、我们知道秒杀具有瞬时高并发的特点,会出现瞬时访问量大,但是秒杀结束后会有一段时间流量小。如果和网站原有应用部署在一起,会对现有业务造成冲击,可能导致瘫痪。
所以在系统层面上需要把秒杀功能单独部署,与原有网站隔离。
2、秒杀是读多写少的操作。在秒杀开始前用户会不断刷新以避免错过秒杀。这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成负载压力。
需要重新设计页面,页面静态化,已达到拦截流量目的。
3、秒杀会增加网站的带宽。
增加CND缓存。
四 秒杀系统设计
4.1 秒杀前端设计
秒杀过程中用户有不断刷新页面的操作,应为该动作没有差异性并且频繁,如果直接访问后台服务或者数据库,一个是响应慢,另一个是可能系统崩溃。好的前端设计能把访问拦截在前端。其实不仅仅是秒杀有这个需求,很多浏览类的门户网站都有这样的需要。
可以通过购买CDN来实现缓存静态资源(商品图片)、网络分发、负载均衡的目的。由于秒杀商品没有更新商品参数的操作,有的会设计定时去刷新CDN缓存的操作,以此来实现CDN缓存和数据库一致性问题。
1、静态资源存放到各CDN节点,把静态资源缓存到各CDN节点,用户可以就近访问,加快访问速度

2、限制用户提交秒杀次数,用户1s内点击秒杀按钮后置灰
3、js控制用户1s内只能提交1次
前段的这些设计能很好的将请求拦截在上游。
4.2 秒杀架构设计
秒杀系统为秒杀而设计,不同于一般的网购行为,参与秒杀活动的用户更关心的是如何能快速刷新商品页面,在秒杀开始的时候抢先进入下单页面,而不是商品详情,因此秒杀系统的页面设计应尽可能简单。
下单表单也尽可能简单,购买数量只能是一个且不可以修改,送货地址和付款方式都使用用户默认设置,没有默认也可以不填,允许等订单提交后修改;只有第一个提交的订单发送给网站的订单子系统,其余用户提交订单后只能看到秒杀结束页面。
4.3 秒杀站点设计
有的黑客可以写程序模拟请求,需要子站点层进行拦截。
1、nginx层针对同一IP限制访问频次
2、同一查询在站点层限制访问频率
这些设计能很好的将请求拦截在站点层。
4.4 秒杀服务层设计
读多写少的请求需要把读写进行分离,不要把大量的请求落到数据库中。
1、针对读请求,使用缓存来处理。
2、针对写请求,把并行请求改为串行请求,每次只放有限的写请求去数据库,成功了再放下一批。