繁体   English   中英

负载平衡akka-http

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM