Количество дроссельных или предельных котлин-рутин - PullRequest
0 голосов
/ 18 октября 2018

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

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

1 Ответ

0 голосов
/ 18 октября 2018

Опция 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

...