秒杀系统乐观锁防止超卖+令牌桶限流

发布于 2021-06-05  903 次阅读


通过乐观锁防止超卖+令牌桶限流

 

//开发一个秒杀方法 乐观锁防止超卖,令牌桶限流
@GetMapping("/killtoken")
public  String killtoken(Integer id){
    LOGGER.info("秒杀商品的 ID = " + id);
    //加入令牌桶的限流措施
    //注意:限流之后商品不能百分百的卖掉,有些请求被抛弃,保留一小部分的商品
    if(!rateLimiter.tryAcquire(2,TimeUnit.SECONDS)){
        return "抢购失败,当前秒杀活动过于火爆,请重试!";
    }
    try {//根据秒杀商品的 ID 调用秒杀业务
        int orderId = orderService.kill(id);
        return "秒杀成功!订单ID为:" + orderId;
    }catch (Exception e){
        e.printStackTrace();
        return e.getMessage();
    }
}

会出现商品剩余的情况,因为在接口限流时有一部分请求被抛弃


查看数据库卖出的商品数量:


如果想多卖一点怎么办呢?
1.并发请求加多(Jmeter测试)
2.尝试获取令牌桶的时间+1s
3.增加令牌桶初始大小

  

她喜欢所以就做咯