高并发三(秒杀系统-—RateLimiter令牌桶限流)

た 入场券 2023-07-19 05:49 135阅读 0赞

一、Guava两种限流模式

原理:系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

稳定模式(SmoothBursty:令牌生成速度恒定),

渐进模式(SmoothWarmingUp:令牌生成速度缓慢提升直到维持在一个稳定值)

二、RateLimiter

20200329213303391.png

  1. //每秒放行20个请求
  2. RateLimiter rateLimiter = RateLimiter.create(20);
  3. @ApiOperation("下单-乐观加锁")
  4. @RequestMapping(value = "/createOptimisticOrder/{stockId}", method = RequestMethod.GET)
  5. @ResponseBody
  6. public String createOptimisticOrder(@PathVariable String stockId) {
  7. /**
  8. * 阻塞式获取令牌
  9. * 库存100,并发500 下同
  10. * 结果:正常
  11. * 库存扣100,下单100
  12. */
  13. log.info("阻塞式获取令牌 限流:{}", rateLimiter.acquire());
  14. /**
  15. * 非阻塞式获取令牌
  16. * 库存100,并发500 下同
  17. * 结果:正常
  18. * 库存扣100,下单100
  19. */
  20. // if(!rateLimiter.tryAcquire(1, TimeUnit.SECONDS)){
  21. // log.info("非阻塞式获取令牌 限流");
  22. // return "购买失败,库存不足";
  23. // }
  24. return orderService.createOptimisticOrder(stockId);
  25. }
  • 阻塞式获取令牌:收到请求,若令牌桶里没有足够的令牌,就在这里阻塞住,等待令牌的发放。
  • 非阻塞式获取令牌:收到请求,若令牌桶里没有足够的令牌,会尝试等待设置好的时间 T,其会自动判断在 T 后,该请求能不能拿到令牌,如果不能拿到,直接返回抢购失败。如果timeout设置为0,则等于阻塞时获取令牌。

这里使用:SmoothBursty

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAzMjE5OQ_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,135人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis令牌

    常见的限流算法: 漏桶算法:能够强行限制数据的传输速率,但是由于流速是恒定的,对突发特性的流量是无法处理的 (nginx限流使用的是漏桶算法,借助limit\_co

    相关 令牌算法

    限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。常用的限流算法有令牌桶和和漏桶,而Google开源项目G