使用akka-http流

时间:2017-10-30 13:33:01

标签: scala akka akka-stream akka-http backpressure

enter image description here

我有一个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永远不会失败。

我想我应该使用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:如果我想优先处理https://test/foo请求,是否需要应用缓冲区 OverflowStrategy.dropNew 。换句话说,应删除https://test/bar的所有不必要的连接。

问题3:是否有更好的方法来实现此要求。我在Sink中使用connection.handleWith[Flow[HttpRequest, HttpResponse]],我不确定这是不对的地方。

如果提供了一些代码段,那将非常受欢迎且非常棒:)

提前致谢

0 个答案:

没有答案