1.RateLimiter比较常用的方法
/**
* 创建一个稳定输出令牌的RateLimiter,保证了平均每秒不超过permitsPerSecond个请求
* 当请求到来的速度超过了permitsPerSecond,保证每秒只处理permitsPerSecond个请求
* 当这个RateLimiter使用不足(即请求到来速度小于permitsPerSecond),会囤积最多permitsPerSecond个请求
*/
public static RateLimiter create(double permitsPerSecond);
/**
* tryAcquire(long timeout, TimeUnit unit)
* 从RateLimiter 获取许可如果该许可可以在不超过timeout的时间内获取得到的话,
* 或者如果无法在timeout 过期之前获取得到许可的话,那么立即返回false(无需等待)
*/
public boolean tryAcquire(long timeout, TimeUnit unit);
2.acquire()方法
用JMeter同时发5个请求访问,可以发现出现了等待RateLimiter rateLimiter = RateLimiter.create(3); @RequestMapping("/spike") public Object spike() { System.out.println("等待时间" + rateLimiter.acquire()); //购买逻辑 return "购买成功"; }
【记录|RateLimiter限流】
等待时间0.0
等待时间0.0
等待时间0.0
等待时间0.0
等待时间0.284812
3.tryAcquire()方法
@RequestMapping("/buy")
public Object buy() {
//判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
System.out.println("脸丑,短期无法获取令牌!");
return "购买失败";
}
System.out.println("购买成功");
//购买逻辑
return "购买成功";
}
用JMeter同时发10个请求访问,可以发现出现了等待超过1秒的情况
购买成功
购买成功
购买成功
购买成功
脸丑,短期无法获取令牌!
脸丑,短期无法获取令牌!
脸丑,短期无法获取令牌!
购买成功
购买成功
购买成功
--------个人使用记录,希望能帮助到大家一点点。
推荐阅读
- spring boot log 多环境配置
- 记录--NPM卸载命令
- jquery.printarea.js 局部打印去掉页眉页脚
- PHP 选择时间获取当前 年,月,日
- php支付宝手机网站支付接口爆缺少签名错误
- 记录|给APP接入极光推送——后端(PHP)
- 做了个订单批量打款
- 使用GIT删除新增的文件