秒杀技术的实现以及相应防作弊策略介绍
一、前言
最近涉及到了秒杀这一块的需求,然后就详细了解了一下秒杀的策略。
二、介绍
1. 秒杀,通俗的说就是在一个特定的时间点,有一定数量的商品,大家都来抢,拼的是速度,拼的就是键盘手。下面就从我自己的角度整体描述一下秒杀的过程。
整体分为3层,ui层、service层、DB层;
1.1 ui层最为和用户直接交互层,分为API和MIS,API是秒杀的接口,MIS为秒杀活动详细信息的配置界面;
1.2 service层,连接UI和DB,作为中间数据处理;
1.3 DB层,存储;
2.策略
对于策略,我们着重于service层,因为UI层主要是提供界面化服务,DB主要做存储;
service,包括CSRF防攻击,验证码校验,ip防刷,以及秒杀;关于CSRF防攻击,验证码校验,ip防刷后面再做介绍,这里说说秒杀。如下图所示,“活动开始与否”以及“查看商品数量num”,这一块的查询量会很大,所以我们使用cache(使用redis),一方面减轻db压力,另一方面由于这块数据变化也很快,没必要固态化,直接存在内存中更好。当用户秒到商品之后,在“更新数据并返回”这一步,我们及时把数据写进redis 。
3.细节
问题1:在同一个时间点,可能有成千上万的用户来秒杀(比如小米定时开放抢手机,某一秒的时间内会有大量用户),这个时候如何做并发处理,保证整个秒杀顺利进行而服务器不挂掉。这里就是刚才说的redis中的队列来帮我们实现了,在redis中保存一个商品数量(比如100),秒中减一,等到返回数量结果等于0,就没有了;redis是原子操作,就能很好解决这种并发问题了。
问题2:反作弊,如下图,是我们一整套防作弊策略
第一步,把用户的唯一标识(还有其他的一些信息)通过一定的算法生成加密串,然后由浏览器发送过来,在服务器端校验;
第二步,验证码校验(这里为了防止用户提前刷验证码),我对每一个验证码加了生成时间,然后在验证的时候同时检验这个验证码的生成时间戳;
第三步,ip防刷,对每一个来秒杀的用户ip,都做一个cache,限制在一定时间内这个相同的ip不能再来秒杀;
第四步,ip黑名单,对于有作弊嫌疑的用户,直接将ip加入黑名单;
最后,我们为了防止有的用户确实是手比较快而经常秒中,那么就再根据用户的唯一标示id,对这个用户在多少天内不能再秒中做限制(哈哈,这个有些残忍^-^);