[英]Load Balancing akka-http
我使用的是akka-http,我的build.sbt配置是:
scalaVersion := "2.11.7"
libraryDependencies += "com.typesafe.akka" % "akka-actor_2.11" % "2.4.2"
libraryDependencies += "com.typesafe.akka" % "akka-http-experimental_2.11" % "2.4.2"
libraryDependencies += "com.typesafe.akka" % "akka-http-spray-json-experimental_2.11" % "2.4.2"
libraryDependencies += "com.typesafe.akka" % "akka-slf4j_2.11" % "2.4.2"
我只用一个GET url暴露了一个简单的REST api
foo是一个返回Future的函数
implicit val actorSystem = ActorSystem("system", config)
implicit val actorMaterializer = ActorMaterializer()
val route: Route = {
get {
path("foo") {
complete { foo }
}
}
}
Web服务预计会有很多调用 ,我想在发生故障时使服务变为冗余,因此我希望同时运行两个实例来处理所有请求。
1)在akka / akka-http中,有两个同时处理请求的Web服务的最佳方法是什么?有外部负载均衡器或者有一些魔法(我不知道)?
2)我需要调整哪些主要参数来改善性能?
这个问题的答案演示了如何在Route
进行Actor调用。
如果将该技术与Akka中的集群功能结合使用,您应该能够完成工作。
让您的路由向Router
发送消息,该消息将消息发送给N个远程部署的Actors中的1个 (从您的问题来看,它听起来像是您想要的循环路由器)。
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进行响应。 此响应可以通过路由器或直接返回到路由 。
路线在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}"))
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.