Мне нужно использовать REST-сервис с использованием Akka HTTP-клиента (v2.0.2). Логический подход заключается в том, чтобы сделать это через пул соединений хоста, потому что мы ожидаем большое количество одновременных соединений. Flow
для этого потребляет (HttpRequest, T)
и возвращает (Try[HttpResponse, T)
. Документация указывает, что некоторый произвольный тип T
необходим для управления потенциальными неупорядоченными ответами на запросы, но не указывает, что должен делать вызывающий объект с возвращенным T
Моя первая попытка - функция ниже, используя Int
как T
Он вызывается из многих мест, чтобы гарантировать, что соединения используют один пул.
val pool = Http().cachedHostConnectionPool[Int]("127.0.0.1", 8888, ConnectionPoolSettings(system))
def pooledRequest(req: HttpRequest): Future[HttpResponse] = {
val unique = Random.nextInt
Source.single(req → unique).via(pool).runWith(Sink.head).flatMap {
case (Success(r: HttpResponse), 'unique') ⇒ Future.successful(r)
case (Failure(f), 'unique') ⇒ Future.failed(f)
case (_, i) ⇒ Future.failed(new Exception("Return does not match the request"))
}
}
Вопрос в том, как клиент должен использовать этот T
? Есть ли более чистое, более эффективное решение? И, наконец, моя паранойя, что что-то может выйти из строя, на самом деле не паранойя?