Scala 负载平衡akka http

Scala 负载平衡akka http,scala,akka,akka-stream,akka-http,Scala,Akka,Akka Stream,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 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"
我公开了一个简单的RESTAPI,它只有一个GET url
foo是一个返回未来的函数

implicit val actorSystem = ActorSystem("system", config)
implicit val actorMaterializer = ActorMaterializer()

val route: Route = {
  get {
    path("foo") {
      complete { foo }
    }
  }
}
web服务预计会有大量调用,我希望在出现故障时使服务冗余,因此我希望同时运行两个实例来处理所有请求

1)让两个web服务入口同时处理请求的最佳方式是什么?使用外部负载平衡器还是使用akka/akka http内部的一些魔法(我不知道是什么?

2) 为了提高性能,我必须调整哪些主要参数?

的答案演示了如何在
路线中进行参与者呼叫

如果你将这种技术与阿克卡内部的能力结合起来,你应该能够完成这项工作

让你的路由发送一条消息到a,该消息将发送到N中的1(从你的问题听起来,你想要的是路由器)

远程参与者使用HttpResponse进行响应。这一反应可以改变

路由将答案粘贴在返回到客户端的指令中

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

嗨@Ramon,谢谢你的回答!!!,我能再问你两个问题吗?1) 如果我使用演员,我会失去流提供给我的背压控制?2) 我要在哪里调用我的foo函数?@geogec,欢迎你回答。1) 我不认为你会失去背压,但我不是100%肯定。我不知道路由调用
onComplete
的效果,它可以转换为
mapsync
mapsyncwait
。2) 我已经修改了我的答案,以保留您原来的
foo
功能。快乐黑客。
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}"))
      }
    }
  }