AkkaHttp:与多个进程并行处理传入请求

时间:2017-11-16 13:52:10

标签: scala parallel-processing akka-http

将AkkaHttp与Scala一起使用,以下代码为/api/endpoint/{DoubleNumber}提供了一个端点。查询此端点会触发繁重的计算,然后将结果返回为application/json

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer

object Run {
  def main(args: Array[String]) = {
    implicit val system = ActorSystem("myApi")
    implicit val materializer = ActorMaterializer()
    implicit val executionContext = system.dispatcher

    val e = get {
      path("api/endpoint" / DoubleNumber) {
        case (myNumberArgument) {
          val result = someHeavyComputation(myNumberArgument)
          complete(HttpEntity(ContentTypes.`application/json`, result.toString))
        }
      }
    }
  }
}

如果从浏览器的控制台发送多个并发请求,则上述代码将等待每个请求完成(并返回响应),然后再开始处理下一个请求。

如何修复上述代码以使其并行工作,换句话说,如果以前的请求仍在处理中,则为每个传入请求启动一个额外的进程?

1 个答案:

答案 0 :(得分:1)

看起来我找到了答案。

如果您遇到同样的问题,只需在someHeavyComputation块内 complete()块中调用val e = get { path("api/endpoint" / DoubleNumber) { case (myNumberArgument) { complete { val result = someHeavyComputation(myNumberArgument) HttpEntity(ContentTypes.`application/json`, result.toString) } } } } ,而不是之前:

{{1}}

必要时将启动新流程。