秒杀技术方案

[转自](https://mp.weixin.qq.com/s/UwtsQLBgBMvDlC0SljHmeQ)
1.秒杀业务流程上的考虑 :采用下单减库存的方案,下单时扣减库存,然后再进行支付。假如真有个别订单不付款怎么办?没关系,秒杀好活动最主要的目的是吸引流量,个别订单不支付对秒杀活动本身影响不大。况且,没支付剩下的库存还可以做为普通商品继续售卖。不过要注意对机器人和自动脚本的防御
2.秒杀页面静态化 放到CDN上预热
3.请求拦截 前端页面,相关按钮点击后置灰,防止重复提交
网关(zuul,nginx)放行与库存数量一致的请求数目
4.后端服务设计
创建订单可以走异步消息队列。后端服务接到下单请求,直接放进消息队列,监听服务取出消息后,先将订单信息写入Redis,每隔100ms或者积攒100条订单,批量写入数据库一次。前端页面下单后定时向后端拉取订单信息,获取到订单信息后跳转到支付页面。用这种**批量异步写入数据库**的方式大幅减少了数据库写入频次,从而明显降低了订单数据库写入压力
5.隔离
6.网络 秒杀前要和网络运营商、CDN服务商提前申请带宽

还有哪些细节要考虑

如何避免超卖?如果在redis中扣减库存,可以利用decr命令扣减库存,decr是原子操作,在分布式环境下也不会有并发问题,decr扣减库存后,判断返回值,如果返回值小于0,扣减库存失败,秒杀也就失败了;如果在数据库中扣减库存可以在where后面加上库存大于0的条件,来避免库存被减成负值。这样就可以避免超卖情况发生了。

接口防刷,前面已经提到过,在网关层对下单等接口按userID限流。

网关层除了对userID做限流外,还要做整体限流。在实际访问量超过预估访问量时,整体限流可以起到保护作用,避免系统被压垮。

防止重复下单,按userID限流已经起到了防止重复下单的作用。假如限制同一个用户10分钟能下一次单,一般情况下10分钟内,商品早已经被抢光了,用户也就没有再次下单的机会了。

可以结合风控系统,在网关层把羊毛党等有问题的用户请求直接拒掉。

可以在网关层上面再加一层防火墙或者高防服务,来防御DDos等分布式网络攻击。

posted @ 2021-07-08 14:14  up~up  阅读(437)  评论(0编辑  收藏  举报