背景
一些业务场景中,我使用 java 在后端代码中可能要对某些流程做频率控制,其实会有很多做法,不同的做法适用于不同的场景
guava 限流
一些简单的对某些流程执行的频率控制
比如服务端代码假如要调用某个 open api,这个 api 会有一定的频控,你不想要触发到这个频控
public class ThirdPartyService {
// 创建一个每秒最多允许 10 次调用的限流器
private final RateLimiter rateLimiter = RateLimiter.create(10.0);
public void callThirdPartyAPI() {
// acquire() 会阻塞直到可以获取到令牌
rateLimiter.acquire();
// 执行调用第三方接口的逻辑
System.out.println("调用第三方接口 - " + System.currentTimeMillis());
}
public static void main(String[] args) {
ThirdPartyService service = new ThirdPartyService();
for (int i = 0; i < 15; i++) {
new Thread(() -> {
service.callThirdPartyAPI();
}).start();
}
}
}
rateLimiter.acquire()
能够控制 callThirdPartyAPI 内的执行逻辑是均匀分布在 0.0s、0.1s、0.2s…0.9s, 1.0s, 1.1s…时执行