В настоящее время я изучаю потоки akka и пытаюсь реализовать простой поток, который получает элемент из источника и вызывает
REST API для каждого элемента.
Упрощенная версия моего кода выглядит так:
source.mapAsync(parallelism){ item =>
Http().singleRequest(HttpRequest(HttpMethods.GET, "http://myserver:8080/$item"))
.flatMap(response => response.entity.toStrict(20.seconds))
}
Мне интересно, как установить parallelism
для получения максимальной пропускной способности, если узким местом является REST-сервер.
Насколько я понимаю, если мы предположим, что сервер не может обрабатывать запрос параллельно, я мог бы использовать parallelism = 1
в первом приближении
и мой поток будет отправлять один запрос за другим.
Если сервер может обрабатывать n
запросов параллельно, поток не будет использовать это, и мне придется установить parallelism = n
, чтобы получить
лучшая пропускная способность.
Теперь я могу поиграть с parallelism
, чтобы оптимизировать пропускную способность для моей установки в данный момент времени.
Однако myserver может быть за балансировщиком нагрузки и автоматическим масштабированием. Тогда количество параллельных запросов, доступных для потока, будет зависеть от времени
и, возможно, моя программа не единственный пользователь REST API.
Теперь мой вопрос: каков наилучший подход для вызова REST API, когда я хочу использовать myserver настолько хорошо, насколько это возможно, но
не хотите сокрушить это, если оно находится под давлением или еще не увеличено?