秒杀令牌的原理和使用方法
秒杀大闸的原理和使用方法
队列泄洪的原理和使用方式
存在缺点:
秒杀下单接口会被脚本不停的刷
秒杀验证逻辑和秒杀下单接口强关联,代码冗余度高
秒杀验证逻辑复杂,对交易系统产生无关联负载
秒杀令牌
秒杀接口需要依靠令牌才能进入
秒杀的令牌由秒杀活动模块负责生成
秒杀活动模块对秒杀令牌生成全权处理,逻辑收口
秒杀下单前需要先获得秒杀令牌
前端先获得秒杀活动的令牌,在创建订单。这样有令牌才能进秒杀接口。秒杀的令牌由秒杀活动模块负责生成。但是如果有成百上亿的用户就会生出很多令牌??---》秒杀大闸
依靠秒杀令牌的授权原理定制化发牌逻辑,做到大闸功能
根据秒杀商品初始库存颁发对应数量令牌,控制大闸流量
用户风控策略前置到秒杀令牌发放中 --就是看用户商品 活动信息对不对
库存售馨判断前置到秒杀令牌发放中 -- 售罄的话redis里面会有一个key,就是判断有key就不发令牌了。
队列泄洪原理
排队有些时候比并发更高效(例如redis单线程模型,innodb mutex key等)
依靠排队去限制并发流量
依靠排队和下游拥塞窗囗程度调整队列释放流量大小
支付宝银行网关队列举例
这里使用固定大小的线程池,默认20个,其他的在LinkedBlockingQueue队列中等待
private ExecutorService executorService;
@PostConstruct
public void int(){
executorService = Executors.newFixedThreadPool(20);
}
本地or分布式 队列泄洪
本地:将队列维护在本地内存中
分布式:将队列设置到外部redis内