当前位置:   article > 正文

RateLimiter限流_ratelimiter.tryacquire

ratelimiter.tryacquire

 1.RateLimiter比较常用的方法

  1. /**
  2. * 创建一个稳定输出令牌的RateLimiter,保证了平均每秒不超过permitsPerSecond个请求
  3. * 当请求到来的速度超过了permitsPerSecond,保证每秒只处理permitsPerSecond个请求
  4. * 当这个RateLimiter使用不足(即请求到来速度小于permitsPerSecond),会囤积最多permitsPerSecond个请求
  5. */
  6. public static RateLimiter create(double permitsPerSecond);
  7. /**
  8. * tryAcquire(long timeout, TimeUnit unit)
  9. * 从RateLimiter 获取许可如果该许可可以在不超过timeout的时间内获取得到的话,
  10. * 或者如果无法在timeout 过期之前获取得到许可的话,那么立即返回false(无需等待)
  11. */
  12. public boolean tryAcquire(long timeout, TimeUnit unit);

2.acquire()方法

  1. RateLimiter rateLimiter = RateLimiter.create(3);
  2. @RequestMapping("/spike")
  3. public Object spike() {
  4. System.out.println("等待时间" + rateLimiter.acquire());
  5. //购买逻辑
  6. return "购买成功";
  7. }

 

用JMeter同时发5个请求访问,可以发现出现了等待

  1. 等待时间0.0
  2. 等待时间0.0
  3. 等待时间0.0
  4. 等待时间0.0
  5. 等待时间0.284812

3.tryAcquire()方法

  1. @RequestMapping("/buy")
  2. public Object buy() {
  3. //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
  4. if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
  5. System.out.println("脸丑,短期无法获取令牌!");
  6. return "购买失败";
  7. }
  8. System.out.println("购买成功");
  9. //购买逻辑
  10. return "购买成功";
  11. }

用JMeter同时发10个请求访问,可以发现出现了等待超过1秒的情况

  1. 购买成功
  2. 购买成功
  3. 购买成功
  4. 购买成功
  5. 脸丑,短期无法获取令牌!
  6. 脸丑,短期无法获取令牌!
  7. 脸丑,短期无法获取令牌!
  8. 购买成功
  9. 购买成功
  10. 购买成功

                                                                                                                           --------个人使用记录,希望能帮助到大家一点点。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/224971
推荐阅读
相关标签
  

闽ICP备14008679号