我使用的是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"我正在公开一个简单的REST,只有一个GET url。
foo是一个返回未来的函数
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)为了提高性能,我需要调整哪些主要参数?
发布于 2016-03-22 14:38:23
这个问题的答案演示了如何在Route中调用Actor。
如果将这一技术与Akka中的聚类功能结合起来,您应该能够完成任务。
让您的路由向Router发送一条消息,该消息将发送给N 远程部署的行为者中的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]))远程执行器使用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}"))
}
}
}https://stackoverflow.com/questions/36142104
复制相似问题