Core Reporting API v3的403(rateLimitExceeded)

时间:2016-09-29 14:36:30

标签: java multithreading google-analytics-api

我们有一个多线程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来解决问题,同时继续使用多线程?

0 个答案:

没有答案