场景还原
某个网站或者APP规定好了在某个时间点,所有人都可以参与抽奖,那么可能百万级的用户会蹲守在那个时间点,到时间大家一起参与这个抽奖。
抢红包,可能是某个电视节目上,突然说扫码可以抢红包,那么电视机前可能千万级的用户会瞬间一起打开手机扫码抢红包。
秒杀更是如此,所谓秒杀,意思是让大家都在电脑前等着,在某个时间突然就可以抢购某个限量的商品。
比如某个手机平时卖5999,现在限量100台价格才2999,50%的折扣,可能百万级的用户就会蹲守在电脑前在比如凌晨12点一起点击按钮抢购这款手机。
还原需求
假设现在有一个抽奖的业务场景,用户在某个时间可以参与抽奖,比如一共有1万个奖,奖品就是某个礼物。
然后参与抽奖的用户可能有几十万,一瞬间可能几十万请求涌入过来,接着瞬间其中1万人中奖了,剩余的人都是没中奖的。然后中奖的1万人的请求会联动调用礼品服务,完成这1万中奖人的礼品发放。
简单来说,需求场景就是如此,然而这里就有很多的地方值得优化了。
初级系统
这个抽奖服务就是用普通的Tomcat来部署的,里面实现了具体的抽奖逻辑,假设刚开始最常规的抽奖逻辑是基于MySQL来实现的,接着就是基于Tomcat部署的礼品服务,抽奖服务如果发现中奖了需要调用礼品服务去发放礼品。
第一次优化
我们可以在负载均衡设备中做一些配置,判断如果同一个用户在1分钟之内多次发送请求来进行抽奖,就认为是恶意重复抽奖,或者是他们自己写的脚本在刷奖,这种流量一律认为是无效流量,在负载均衡设备那个层次就给直接屏蔽掉。
举个例子,比如有几十万用户瞬间同时抽奖,最多其实也就几十万请求而已,但是如果有人重复抽奖或者是写脚本刷奖,那可能瞬间涌入的