节流或限制 Kotlin CoRoutine 计数

Throttle or Limit Kotlin CoRoutine count

我正在尝试从我的协程中访问一个 http 服务。我可能不得不点击该服务一百万次。我更喜欢并行执行,因为它们彼此独立,同时我不想 DOS 该服务。我想限制我的协程(某种背压)

我知道我可以将请求批处理到可接受的并发请求数。但是,我认为那太样板了。是否有任何 http 库以惯用的方式处理此问题

选项 1:

OK HTTPretrofit 可以限制请求数:

Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(10);
OkHttpClient client = new OkHttpClient.Builder()
    .dispatcher(dispatcher)
    .build();

您可以在此处查看示例:
协程有一个适配器:https://github.com/JakeWharton/retrofit2-kotlin-coroutines-adapter
所以两者一起会给你你所需要的。

选项 2:

将 Retrofit 与 AsyncHttpClient 一起使用,它也有一个适配器:https://github.com/AsyncHttpClient/async-http-client/tree/master/extras/retrofit2

然后像这样限制资源:

AsyncHttpClient http = asyncHttpClient(config()
    .setMaxConnections(500)
    .setMaxConnectionsPerHost(200)
    .setPooledConnectionIdleTimeout(100)
    .setConnectionTtl(500)
);

该示例来自维基:https://github.com/AsyncHttpClient/async-http-client/wiki/Connection-pooling

选项 3:

无需改装即可使用上述客户端之一(或任何其他客户端)。然后自己包装回调或找到一个已经这样做的库(存在于许多回调类型中):https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#wrapping-callbacks