我如何排队和延迟改造请求以避免达到 api 速率限制?
How can I queue up and delay retrofit requests to avoid hitting an api rate limit?
我正在使用实施节流的 api。限制之一是 1 request/second。啊。
我有以下立即达到极限的场景。
用api/status
检查api的状态
如果 api 已启动,请获取用户订阅
从订阅列表加载页面
有什么我可以插入改造中的东西可以将每个网络请求排队到仅 运行 最后一个之后至少 1000 毫秒?我是using/learning rxjava,debounce
在这里有用吗?
您可以限制您的 observable。
Observable<String> text = ...
text.throttleLast(1, SECONDS)
.flatMap(retrofitApiCall())
.subscribe(result -> System.out.println("result: " + result));
另一种解决方案是在您的 okhttp 构建器中设置一个调度程序,并添加一个休眠一秒钟的拦截器。这可能不是最优雅的解决方案,并且会扼杀使用异步的一些好处,因为它一次只能使用一个线程。
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(1);
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
SystemClock.sleep(1000);
return chain.proceed(chain.request());
}
};
builder.addNetworkInterceptor(interceptor);
builder.dispatcher(dispatcher);
builder.build();
interceptor (from OkHttpClient) combined with a RateLimiter(来自 Guava)是避免 HTTP 429 错误代码的好方法。
假设我们希望限制为每秒 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 limiter = RateLimiter.create(3);
@Override
public Response intercept(Chain chain) throws IOException {
limiter.acquire(1);
return chain.proceed(chain.request());
}
}
我正在使用实施节流的 api。限制之一是 1 request/second。啊。 我有以下立即达到极限的场景。
用api/status
检查api的状态
如果 api 已启动,请获取用户订阅
从订阅列表加载页面
有什么我可以插入改造中的东西可以将每个网络请求排队到仅 运行 最后一个之后至少 1000 毫秒?我是using/learning rxjava,debounce
在这里有用吗?
您可以限制您的 observable。
Observable<String> text = ...
text.throttleLast(1, SECONDS)
.flatMap(retrofitApiCall())
.subscribe(result -> System.out.println("result: " + result));
另一种解决方案是在您的 okhttp 构建器中设置一个调度程序,并添加一个休眠一秒钟的拦截器。这可能不是最优雅的解决方案,并且会扼杀使用异步的一些好处,因为它一次只能使用一个线程。
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(1);
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
SystemClock.sleep(1000);
return chain.proceed(chain.request());
}
};
builder.addNetworkInterceptor(interceptor);
builder.dispatcher(dispatcher);
builder.build();
interceptor (from OkHttpClient) combined with a RateLimiter(来自 Guava)是避免 HTTP 429 错误代码的好方法。
假设我们希望限制为每秒 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 limiter = RateLimiter.create(3);
@Override
public Response intercept(Chain chain) throws IOException {
limiter.acquire(1);
return chain.proceed(chain.request());
}
}