Выборочное регулирование запросов с использованием потока 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]] в раковине, и я не уверен, что это правильное место.

Если есть некоторый фрагмент кода, это будет очень ценно и супер здорово:)

заранее спасибо

0 ответов

Другие вопросы по тегам