前端页面,相关按钮点击后置灰,防止重复提交
网关(zuul,nginx)层,为了避免前端恶意请求,比如一些攻击脚本,在网关层要对下单等接口按userID限流,几秒钟只能访问一次。考虑到秒杀场景参与人多,秒杀成功的人极少,我们可以把绝大部分抢购下单请求在网关层直接拒掉,按秒杀失败处理。这样就极大减少了后端服务的压力。
还有哪些细节要考虑:
-
如何避免超卖?如果在redis中扣减库存,可以利用decr命令扣减库存,decr是原子操作,在分布式环境下也不会有并发问题,decr扣减库存后,判断返回值,如果返回值小于0,扣减库存失败,秒杀也就失败了;如果在数据库中扣减库存可以在where后面加上库存大于0的条件,来避免库存被减成负值。这样就可以避免超卖情况发生了。
-
接口防刷,前面已经提到过,在网关层对下单等接口按userID限流。
-
网关层除了对userID做限流外,还要做整体限流。在实际访问量超过预估访问量时,整体限流可以起到保护作用,避免系统被压垮。
-
防止重复下单,按userID限流已经起到了防止重复下单的作用。假如限制同一个用户10分钟能下一次单,一般情况下10分钟内,商品早已经被抢光了,用户也就没有再次下单的机会了。
-
可以结合风控系统,在网关层把羊毛党等有问题的用户请求直接拒掉。
-
可以在网关层上面再加一层防火墙或者高防服务,来防御DDos等分布式网络攻击。