Дросселировать или ограничивать количество программ Kotlin CoRoutine

Я пытаюсь запустить http-сервис из своей сопрограммы. Возможно, мне придется звонить в сервис миллион раз. Я предпочитаю делать это параллельно, так как они не зависят друг от друга, в то же время я не хочу использовать DOS для этой службы. Я хочу задушить свою сопрограмму (какое-то обратное давление)

Я знаю, что могу группировать запросы до приемлемого количества одновременных запросов. Но это слишком шаблонно, я думаю. Есть ли какая-нибудь http-библиотека, которая справляется с этим идиоматическим способом?


person so-random-dude    schedule 18.10.2018    source источник


Ответы (1)


Вариант 1:

OK HTTP с retrofit можно ограничить количество запросов:

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

Вы можете увидеть пример здесь: OkHttpClient ограничивает количество подключений?
Существует адаптер для сопрограмм: 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

person oshai    schedule 18.10.2018