我遇到过这样的情况,一些用户最终陷入了一个循环,要求太频繁地调用API。太频繁=每秒10-20倍。
目前,我还没有找到问题所在,似乎这不是一个容易解决的问题,但我想知道,是否有可能对改型2设置某种限制,如果应用程序进入某种循环,单个API请求被多次调用,它实际上会忽略这些请求,例如,是否在第二个最大值内完成1-5倍的相同请求或类似的请求?
如何做到这一点(从网络库设置的角度)?(在找到根本原因之前,我想保护后端)
Guava的拦截器与RateLimitor相结合是避免接收429 HTTP代码的一个很好的解决方案。
假设我们想要每秒3个呼叫的限制:
import java.io.IOException;
import com.google.common.util.concurrent.RateLimiter;
import okhttp3.Interceptor;
import okhttp3.Response;
public class RateLimitInterceptor implements Interceptor {
private RateLimiter rateLimiter = RateLimiter.create(3);
@Override
public Response intercept(Chain chain) throws IOException {
rateLimiter.acquire(1);
return chain.proceed(chain.request());
}
}
根据这个答案,您可以使用调度程序如下:
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(1);
OkHttpClient client = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.build()
之后,您将能够一次发送一个请求。