关于削峰技术,常用场景例如秒杀。为什么要流量削峰?之所以叫秒杀,也就是第一秒的时候流量涌入的问题,瞬时流量变大可能对机器造成影响,因此我们需要把第一秒的流量平滑的过度掉,削弱峰值,把流量平滑的过渡到第二秒或者后面,让系统性能有平滑的提升。
对于我们现在没有做任何操作的时候,秒杀下单的接口会被脚本不停地刷。秒杀验证逻辑和秒杀下单接口强关联,代码冗余度高。秒杀验证逻辑复杂,对交易系统产生无关联负载。
因此我们引入了秒杀令牌原理:
秒杀接口需要依靠令牌才能进入。秒杀令牌由秒杀活动模块负责生成。
秒杀活动模块对秒杀令牌生成全权处理,逻辑收口。
秒杀下单前用户需要先获得令牌才能秒杀。
接下来实战一下:
把用户校验的全部写到一个接口中:
//生成秒杀令牌
@RequestMapping(value = "/generatetoken",method = {RequestMethod.POST},consumes={CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType generatetoken(@RequestParam(name="itemId")Integer itemId,
@RequestParam(name="promoId")Integer promoId) throws BusinessException {
//根据token获取用户信息
String token = httpServletRequest.getParameterMap().get("token")[0];
if (StringUtils.isEmpty(token)){
throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登陆,不能下单");
}
UserModel userModel = (UserModel) redisTemplate.opsForValue().get(token);
if(userModel == null){
throw new BusinessException(EmBusinessError.USER_NOT_LOGIN,"用户还未登陆,不能下单");