我有一个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]]
,我不确定这是不对的地方。
如果提供了一些代码段,那将非常受欢迎且非常棒:)
提前致谢