赞
踩
1. 高并发,重复刷接口 对服务器的负载冲击
2. 高并发,带来的超卖,需要控制商品数量
3. 高负载 下单速度和成功率的保障
1. 等待抢购(正常提前1周)
2. 预约
3. 等待抢购
4. 抢购
20个实例
通过给预约用户提前发放token,20w的库存,发30w个token
把token放在用户cookie中
1.有token的参与秒杀,
2. 没有token的看单机动画 (抢购中...没有抢购成功)
对于重复请求限流,可以同redis集群 (redis计数器,漏桶,令牌桶),(分片,二级缓存)
限流工具类RateLimiter
服务治理---限流(令牌桶算法)
可以通过nginx限制
1. 100w的请求到服务器,尽快处理前面的商品,20w的商品
2. 网关过滤剩下80w的请求,可以通过令牌桶
3. 20个网关,每个服务实例处理5w的请求,分配1.5w的令牌,同时分配1w的商品库存
4. 每个tomcat做到1000-2000的qps响应
5. 每个网关开1.5w个令牌桶,总共20个实例,实际发放30w个令牌,得不到令牌的直接返回失败,耗时比较短,不会到下单流程
6. 大部分请求被拒绝,剩余的进入下单消息队列
1. 数据库1秒2000的写入,比较难,集群也只能达到10000
2. 下单请求可以把订单商品,订单信息,下到redis里面
3. 考虑到redis压力,可以对不同用户的订单下单到不同的redis里面(分片)
4. 订单放在redis目的:
4.1 速度快
4.2 用户下单后正常会不停的查询下单是否成功,可以作为订单查询使用
1. 后端数据库正式写入,
2. 通过消息队列,流量削峰,
3. 让后端消费消息,入库(执行耗时的入库操作,分布式事务)
4. 入库完成后,可以把redis的订单信息删除
Redission是 封装好的分布式锁的方案,可以对商品id加锁
如果商品数量几千个,还行
加锁,解锁,一次5-10ms
平均1秒100多单
几十万次,时间开销很大
性能问题
所以针对20w商品,需要对 商品数量 分片
1个分布式锁 500个商品数量
商品id10 goodsId-10-1/goodsId-10-2/goodsId-10-3 500个
通过hash放到不同的key上面
如果redis压力比较大,redis再做集群(主从)
比较难以控制不同key余量的消耗
总结下来这种方案“太复杂”
在服务器实例直接写好商品的数量,不需要走redis,不需要通信,效率比较高
20w的商品
通过配置中心,下发每个实例商品的数量,动态控制
抢购开始,下发每个服务10000的商品数量
当这个实例将内存的商品数量消耗完成的时候,卖完了
微服务配置中心的技术选型一般有以下几个:Apollo、Disconf、Spring Cloud Config、Nacos等
Apollo(携程开源)
nacos(阿里开源)
Spring Cloud Config(Spring Cloud 全家桶成员)
【配置中心概念】
配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue)。
配置中心的功能就是当某个配置项发生变更时,不停机就可以动态刷新服务内部的配置项
抢购的过程中,服务挂了,可以暂时先不管,结果就是少卖出去一些
后面出了方法:等所有的卖光了,剩余7000个,再启动卖
也可以等超过30分钟后,和没付款的,订单取消,一起丢到库存池再卖
前端:Thymeleaf,Bootstrap,Jquerry
后端:SpringBoot,MybatisPlus,Lombok
中间件:RabbitMQ,Redis
分布式会话:用户登录,共享session
功能开发:商品列表,商品详情,秒杀,订单详情
系统压测:JMeter入门,yace
页面优化:页面缓存,url缓存,对象缓存,静态化,前后端分离
服务优化:RabbitMQ消息队列,接口优化,分布式锁
安全优化:隐藏秒杀地址,算术验证码,接口限流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。