秒杀系统总结与思考(四) 流量削峰

什么是流量削峰

秒杀这一场景,削峰的本质是更多的延缓用户请求的发出,以便减少和过滤一些无效的请求,遵从“请求数尽量少”的原则

为什么要用

削峰的存在,一是可以让服务器端处理变的更加平稳,二是节省服务器资源成本。

实现思路

排队、答题、分层过滤

排队

1、利用线程池加锁等待
2、先进先出、仅仅后出等常用的内存排队算法
3、请求序列化文件,然后再顺序读文件恢复请求

答题

作用: 1、防作弊。2、延缓请求
秒杀系统总结与思考(四) 流量削峰
答题模块三部分
1、题库生成,重要防止机器算出结果
2、题库推送模块,秒杀答题前,把题目提前推送给详情和交易。题库推送目的是为了保证每次用户请求的题目是唯一,目的也是防止答题作弊
3、题目图片生成模块,生成图片增加干扰因素,同样防止机器。答题应该将题目图片提前推送到CDN进行预热。

答案验证逻辑

秒杀系统总结与思考(四) 流量削峰
用户提交答案和题目答案比较,如果验证通过就继续下一步下单逻辑,否则就失败。将问题和答案用下面key来进行MD5加密:
· 问题key: user + itemId + question_id + time + pk
· 答案key: userId + itemId + answer + pk

还需要注意的:
除了验证答案,还要验证用户本身信息(是否登录,cookie是否完整等)
对提交答案时间做出限制,超过1s的可能是机器答题

分层过滤: 过滤无效请求

分层校验的基本原则: (每一步都做库存校验,不做强一致性要求,写操作时再做强一致校验)
1、将动态请求的读数据缓存(cache)在Web端,过滤无效数据读
2、对数据不坐强一致性校验,减少一致性校验产生的瓶颈
3、对数据进行基于时间的合理分片,过滤过期失效请求
4、对写请求做限流保护,将超出系统承载能力的请求过滤
5、对数据进行强一致性校验,只保留最后有效数据。