负载平衡akka-http

时间:2016-03-21 21:37:52

标签: scala akka akka-stream akka-http


我使用的是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)我需要调整哪些主要参数来改善性能?

1 个答案:

答案 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}"))
      }
    }
  }