Выборочное регулирование запросов с использованием потока akka-http
У меня есть один API, который вызывает два других нисходящих API. Один нижестоящий API (https://test/foo
) очень важно, и это очень быстро. Еще один медленный вниз по течению API (https://test/bar
) имеет ограничение, пропускная способность которого может обрабатывать только 50 запросов в секунду.
Я хотел бы убедиться, что вниз по течению API https://test/foo
имеет больший приоритет, чем https://test/bar
, Например, если пул потоков API равен 75, я разрешу проходить только 50 параллельных входящих соединений. https://test/bar
, Остальные соединения должны быть использованы для https://test/bar
, Это сделало бы https://test/bar
никогда не подведет
Я думаю, что я должен применить Throttle или, возможно, буфер с OverflowStrategy.dropNew для https://test/bar
,
Вот фрагмент кода.
implicit val actorSystem = ActorSystem("api")
implicit val flowMaterializer = ActorMaterializer()
val httpService = Http()
val serverSource: Source[Http.IncomingConnection, Future[Http.ServerBinding]] =
httpService.bind(interface = "0.0.0.0", 3000)
val binding: Future[Http.ServerBinding] =
serverSource
.to(Sink.foreach { connection =>
connection.handleWith(
Flow[HttpRequest]
.map {
case HttpRequest(GET, Uri.Path("/priority-1"), _, _, _) =>
HttpResponse(entity = scala.io.Source.fromURL("https://test/foo").mkString)
case HttpRequest(GET, Uri.Path("/priority-2"), _, _, _) =>
HttpResponse(entity = scala.io.Source.fromURL("https://test/bar").mkString)
}
)
}).run()
Вопрос 1: куда мне положить throttle(50, 1 seconds, 5000, ThrottleMode.Shaping)
соответствовать только https://test/bar
порог.
Вопрос 2: мне нужно применить буфер и OverflowStrategy.dropNew, если я хочу расставить приоритеты https://test/foo
Запросы. Другими словами, все ненужные соединения для https://test/bar
должны быть удалены.
Вопрос 3: Есть ли лучший способ выполнить это требование. я использую connection.handleWith[Flow[HttpRequest, HttpResponse]]
в раковине, и я не уверен, что это правильное место.
Если есть некоторый фрагмент кода, это будет очень ценно и супер здорово:)
заранее спасибо