使用Guava-RateLimiter,实现限制调用第三方的QPS

<!--QPS-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
package com.example.demo.qps;

import com.google.common.util.concurrent.RateLimiter;


import java.util.concurrent.TimeUnit;

/**
* QPS
*
* @author
* @since 2024/12/27 11:12
*/
public class LimitCallService {
//每秒只发出5个令牌
static RateLimiter rateLimiter = RateLimiter.create(5.0);

public static void main(String[] args) throws Exception {

// for (int i = 0; i < 10; i++) {
// final int index = i;
// new Thread(() -> {
// //获取不到则阻塞
// rateLimiter.acquire();
// System.out.println("acquire" + index + ":" + System.currentTimeMillis());
// }).start();
// }

for (int i = 0; i < 10; i++) {
final int index = i;
new Thread(() -> {
try {
TimeUnit.MILLISECONDS.sleep(index * 100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//获取不到就立即返回false,
// *注意:5个QPS表示1秒被切分成了5个200毫秒,如果同一时刻并发访问,只有一个线程能获取到令牌
// 也就是200毫秒之后才会发放下一个令牌
boolean b = rateLimiter.tryAcquire();
System.out.println("tryAcquire" + index + ":"+ b + System.currentTimeMillis());
}).start();
}

}
}

 

——参考Guava-RateLimiter详解 - 简书

posted @ 2024-12-27 11:55  荒野猛兽  阅读(40)  评论(0)    收藏  举报