Слишком много одновременных запросов с Akka и фьючерсами - PullRequest
0 голосов
/ 03 декабря 2018

Мой сценарий примерно такой.

  1. У меня есть вектор, состоящий из большого количества отчетов, которые необходимо отправить с помощью вызова API api.
  2. Я использую Futures.traverse (вектор, упомянутый в 1)
  3. Так как вектор слишком велик, он терпит неудачу с превышением максимального количества открытых запросов.

Одним из первоначальных решений, о котором я мог подумать, является увеличение параметра max-open-questions.Но проблема в том, что я не знаю, сколько отчетов нужно отправлять заранее.

Может кто-нибудь предложить альтернативное решение, например, ограничение параллелизма, которое происходит через Futures.traverse

1 Ответ

0 голосов
/ 05 декабря 2018

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

Source(reportsVector)
  .grouped(safeValue)
  .mapAsync(1)(reps => Future.traverse(reps)(x => ...)) //do your stuff
  .mapConcat(identity)
  .runWith(Sink.seq)

Пример будет выполнять safeValue одновременных вызовов одновременно и собирать все результаты вколлекция, которая будет возвращена после завершения всего потока.Вы также можете поиграть с другими операторами, такими как sliding и splitWhen, чтобы сделать его более подходящим для вашего случая использования, вы также можете настроить значения одновременности safeValue и mapAsync.Обратите внимание, что источником этого потока является известный вектор (reportsVector), но он также может быть неизвестным конечным потоком отчетов.

...