我使用的是akka-http,我的 build.sbt 配置是:
implicit val actorSystem = ActorSystem("system", config)
implicit val actorMaterializer = ActorMaterializer()
val route: Route = {
get {
path("foo") {
complete { foo }
}
}
}
我暴露了一个只有一个GET URL的简单REST api foo是一个返回Future的函数
{{1}}
Web服务预计会有很多调用,我想在发生故障时使服务变为冗余,所以我希望同时运行两个实例来处理所有请求
1)有两个同时处理请求的Web服务的最佳方法是什么?有一个外部负载均衡器或者有一些魔法(我不知道)在akka /中akka-http?
2)我需要调整哪些主要参数来改善性能?
答案 0 :(得分:5)
this question的答案演示了如何在Route
内拨打电话。
如果您将此技术与Akka中的clustering功能结合使用,您应该能够完成工作。
让你的路由向Router
发送消息,将消息发送到N remotely deployed Actors中的1个(从你的问题来看,它听起来像round robin路由器就是你想要的)。
class HttpResponseActor extends Actor {
def foo : HttpResponse = ??? // Not specified in question
override def receive = {
case _ : HttpRequest => foo
}
}
import akka.actor.{ Address, AddressFromURIString }
import akka.remote.routing.RemoteRouterConfig
val addresses = Seq(Address("akka.tcp", "remotesys", "otherhost", 1234),
AddressFromURIString("akka.tcp://othersys@anotherhost:1234"))
val routerRemote =
system.actorOf(RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[HttpResponseActor]))
远程Actor使用HttpResponse进行响应。此回复可以go through the Router or directly back to the Route。
路线将答案放在complete
指令中,以便返回给客户。
val route =
get {
path("foo") {
onComplete((routerRemote ? request).mapTo[HttpResponse]) {
case Success(response) => complete(response)
case Failure(ex) => complete((InternalServerError, s"Actor not playing nice: ${ex.getMessage}"))
}
}
}