我们有一个多线程Java应用程序,它从CoreV3 API中提取数据。
我们使用Guava的RateLimiter和JDK的Semaphore来达不到每个IP地址10 RPS和10个并发请求的限制。
这是一个代码段:
private static final int MAX_CONCURRENT_REQUESTS = 6;
private static final int MAX_REQUESTS_PER_SECOND = 6;
private static final Semaphore SEMAPHORE = new Semaphore(MAX_CONCURRENT_REQUESTS);
private static final RateLimiter RATE_LIMITER = RateLimiter.create(MAX_REQUESTS_PER_SECOND);
private <T extends GenericJson> T execute(AnalyticsRequest<T> request) throws IOException {
try {
SEMAPHORE.acquireUninterruptibly();
RATE_LIMITER.acquire();
return request.execute();
} finally {
SEMAPHORE.release();
}
}
但是当多个线程同时获得5XX错误代码时,所有后续请求都会在403(rateLimitExceeded)错误的情况下失效很长一段时间。
每个单独的线程都使用指数BackOff算法来重新发送失败的请求。
我们应该如何使用rateLimitExceeded来解决问题,同时继续使用多线程?