为什么秒杀系统的设计是一个难点?
- 秒杀开始,会有大量用户同时参与,因此需要满足高并发和高性能
- 保证秒杀的整个流程的顺利进行,需要满足高可用
- 商品库存有限,在大量订单的情况下,一定不能超卖,需要保持一致性
高性能
1. 热点数据处理
热点数据:某一时间段内被大量访问的数据
处理方案:热点数据放在缓存Redis中,并且最好可以写入到jvm内存一份(多级缓存),并设置个过期时间,需要写入到jvm的热点数据不宜过多,避免内存占用过大,要设置淘汰策略。
2.静态资源处理
处理方案:使用CDN(内容分发网络)。将静态资源分发到多个不同的地方以实现就近访问,进而加快静态资源的访问速度,减轻服务器以及带宽的负担。
高可用
1.集群化
解决方案:Redis通过异步复制搞个一主多从来提高可用性和读吞吐量,需要用到sentinel(哨兵)对运行节点进行监控,主节点出现故障时,能帮助实现故障转移,确保Redis系统可用性
2.限流
①接口限流
使用Sentinel,提供流量控制、熔断降级、系统自适应保护等功能来保护系统的稳定和可用性
除了直接对接口进行限流之外,还可以对用户、IP进行限流,限制同一用户以及IP单位时间内可以请求接口的次数
②问题/验证码
一方面可以避免用户请求过于集中,另一方面可以有效解决用户使用脚本作弊
③提前预约
通过提前预约来过滤掉一批人
3. 流量削峰
使用消息队列
4. 降级
对一些服务进行降级,来保证核心任务的正常运行。
5.熔断
防止因为秒杀交易影响到其他正常服务的提供
一致性
1.减库存方案
一般情况下都是 下单减扣库存。
秒杀商品信息一般都提前放入缓存中,可以通过Redis对库存进行原子操作
2.接口幂等
幂等:不论执行多少次相同的请求,产生的效果和返回的结果都和发出单个请求是一样的。
前端可以通过按钮致灰处理
后端可以通过分布式锁处理(一般基于Redis来做,推荐Redisson)
性能测试
比较常用的性能测试工具:Jmeter,LoadRunner,Galtling,ab