优惠券被刷

背景

  双十二活动期间,为了活跃气氛、提高销量,我们在商城首页弄了一个老虎机,通过该老虎机可以进行抽奖,奖品就是优惠券。满1500减100、满2000减200,不过这些都是比较普通的优惠券,优惠力度并不大。让我们没想到的是,运营还放出了20张满0减1000的优惠券。在用老虎机进行抽奖的时候,会提示有什么样的优惠券。

  这一下让黄牛看到了商机,不知道他们从哪里找到了大量用户的账号和密码,对我们的抽奖接口疯狂的刷。活动刚上线的时候,系统运行良好。但是过了几个小时,客服那边接到了投诉电话,用户说抽到了优惠券,但是在自己的个人中心并没有找到。我们也尝试了下,发现这个问题是确实存在。

  我第一个反应就是优惠券系统出了问题,马上查线上日志,发现日志打印正常,但是用grep命令,搜我自己的账号时,发现在这一段时间内的日志没有任何记录。“请求没过来”,发奖系统出问题了。跳到发奖系统的线上服务器上,继续看日志,但也没有发现异常日志。但是却能grep到我刚才的抽奖信息,并且还是处理成功的。

  最后,查了下发奖系统的redis队列,发现里面堆积了上万条请求。“接口被刷了,完!!”。我们job的处理速度是每秒30个请求,分析了下黄牛刷接口的频率是每秒40个。这样的话,队列中会堆积越来越多的请求,所有才会出现用户投诉的问题。

解决办法

  既然你刷,那我就封你IP。找运维帮忙查看了下请求最频繁的IP,发现请求大部分来自阿里云。哎,肯定是写好了代码,放在阿里云上跑,也是够下本的。运维把IP封了后,队列中的请求请求数量慢慢降了下来。系统又正常运行了。

  以为问题解决了,谁知道第二天,队列中的请求又开始堆积了。黄牛换了不同的IP,又开始继续刷券。这次我们分析了下我们job的处理速度和他们刷券的频率,让运营的人限制用户每天能抽中奖的次数。问题解决。

  又过了一天,我们分析了这几次刷券用户的id,发现这些用户id刷券的顺序和时间段几乎一致。那这就好办了,我们把凌晨1点到6点的请求进行分析,然后清空这个队列,让黄牛白刷。

问题的原因

  出现的问题的原因,我们商场早期用户注册是不需要手机号验证的,这也就导致了那时候,有黄牛批量注册用户,导致了今天这样的问题的出现。