业务场景:100w人1000块抢10个iphone13
面临的问题:
1.流量太大把服务宕机
2.mysql数据库承受不住这么大的压力
3.如何保证iphone13不会被多抢
4.活动开始前不停有人刷新业务,后台如何承受压力
5.黄牛用脚本秒杀
6.竞争对手秒杀到不付款导致库存积压
7.添加redis缓存后如何保证数据库和redis缓存一致性
处理方法:
1.添加redis缓存解决数据库压力过大的问题
2.用redission分布式锁解决超卖问题
3.用google的RateLimiter限流,前置也可以用nginx进行限流
4.用三级缓存解决查询压力问题,第一级缓存:jvm缓存,第二级缓存:redis,第三级:数据库
5.openrestry+lua大大提升查询效率,第一级缓存openrestry本地缓 第二级:lua+redis 第三级:应用查询
6.redis+mysql数据一致性的保证:rocketmq分布式事物,利用两阶段提交来保证数据库和redis一致性,第一阶段如果有异常则返回rollback,把这条消息不发送出去,也就是数据库不会扣减库存
然后同时把发送端已经入库的数据加上事物,出现异常则回滚,redis扣减的库存发生异常后进行补回操作。此时如果rocket宕机或者消息发送失败的话需要确认状态,我们可以添加一张记录抢购是否成功的流水表,用该流水表来判断是否成功以此来断定是否需要把该消息发送到消费者。
7.用验证码来防止黄牛
8.用秒杀大闸来解决流量过大的问题,如果拿不到token则请求失败
9.同时用nginx来进行横向扩展,增加流量入口
10.利用线程池原理进行队列泄洪,来保证突发流量。
11.redis记录库存是否售罄标志位,如果卖完,后续的请求直接返回失败,同时把热点商品预热