#miaosha
##项目目标 支撑“小米印度抢购搞挂亚马逊事件”:http://bbs.xiaomi.cn/t-13417592
小米在印度打破了多项记录:
##涉及到的框架说明
##实现结构
恶意请求过滤-->限流-->redis消息队列执行占位操作,获得下单token-->用户传入token下单
如下为抢购流程:
##请求过滤
##实时限流器
##各个方案
磁盘IO,开发机器实测2280 OPS,速度太低,当出现海量请求时会导致大量请求线程被阻塞,拒绝后续请求,拖垮整个tomcat和DB。
###2. redis+消息队列+更新数据库(秒杀和下单操作分离)
a.用户请求过来,将请求入消息队列;
b.消息处理,先减redis库存量,如果减库存成功,则生成下单token存入redis(设定有效期,比如2分钟之内下单有效),等待用户下单(这样就避免下单也面对大量并发);如果减库存失败,则消息记录回到消息队列中,等待再次处理;
c.用户下单:判断token是否失效(比对时间)了,如果未失效则扣减库存(也可能扣减库存失败),生成订单;如果已经失效了,则redis库存增加1; 如何确保下单token过期了释放资格?JOB 每分钟扫token缓存,如果失效了的则清除调,并回馈redis缓存(redis库存+1);
d、前端用户如何获知抢购成功了(获得了下单资格):ajax轮训查询接口。 说明:为什么要采用轮询而不是用实时的websocket推送?经测试,一台tomcat最多能连接3000个websocket,如果类似抢购的大量用户抢购,机器肯定是扛不住这么多长连接的,而查询用户是否抢购成功也只是查询的redis,因此采用轮询是很好的选择。
e、为什么要秒杀和下单操作分离?一方面,秒杀接口可以阻挡大部分并发流程,从而让下单操作错开并发高峰;另一方面,可以让秒杀操作和下单操作从业务上相分离,使得秒杀操作可以独立于订单相关业务。
###3. 防刷过滤器+redis+消息队列+更新数据库 针对第2方案中可能出现被辅助软件而已刷单的现象,可以增加过滤器:如果用户在指定时间内请求多少次,则认为是恶意用户,可以直接将该用户加入黑名单,并在后续的消息队列处理中不给黑名单的用户分配资格。
消息队列异步处理流程图:
##性能测试
##前端页面 前端技术拙劣,所有前端页面均来自于GitHub上(实在找不到原地址是什么了。。)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
代码活跃度
社区活跃度
团队健康
流行趋势
影响力
:与代码提交频次相关
:与项目和用户的issue、pr互动相关
:与团队成员人数和稳定度相关
:与项目近期受关注度相关
:与项目的star、下载量等社交指标相关