本章目标
- 掌握秒杀令牌的原理和使用方式
- 掌握秒杀大闸的原理和使用方式
- 掌握队列泄洪的原理和使用方式
抛缺陷:
- 秒杀下单接口会被脚本不停的刷
- 秒杀验证逻辑和秒杀下单接口强关联,代码冗余度高
秒杀下单和对活动是否开始是没有关联的,接口关联过高
- 秒杀验证逻辑复杂,对交易系统产生无关联负载
9-2 秒杀令牌实现
- 秒杀接口需要依靠令牌才能进入
- 秒杀的令牌由秒杀活动模块负责生成
- 秒杀活动模块对秒杀令牌生成全权处理,逻辑收口
- 秒杀下单前需要先获得秒杀令牌
代码实现
PromoService接口上实现generateSecondKillToken秒杀令牌生成函数
//生成秒杀用的令牌
String generateSecondKillToken(Integer promoId,Integer itemId,Integer userId);
PromoServiceImpl
public String generateSecondKillToken(Integer promoId,Integer itemId,Integer userId) {
PromoDO promoDO = promoDOMapper.selectByPrimaryKey(promoId);
//promoDo(dataObject) -> PromoModel
PromoModel promoModel = convertFromDataObject(promoDO);
if(promoModel == null) {
return null;
}
//判断当前时间是否秒杀活动即将开始或正在进行
DateTime now = new DateTime();
if(promoModel.getStartDate().isAfterNow()) {
promoModel.setStatus(1);
}else if(promoModel.getEndDate().isBeforeNow()) {
promoModel.setStatus(3);
}else {
promoModel.setStatus(2);
}
//判断活动是否正在进行
if(promoModel.getStatus