喷雾的“分离”指令

时间:2015-07-12 04:37:23

标签: scala spray

给出以下Spray代码:

object Main extends App with SimpleRoutingApp {

  implicit val system = ActorSystem("my-system")

  val pipeline: HttpRequest => Future[String] = sendReceive ~> unmarshal[String]

  startServer(interface = "localhost", port = 8080) {
    path("go") {
      get { 
        detach() { 
          complete {
            val req = Post("http://www.google.com") ~> addHeader("Foo", "bar")
            pipeline(req).recoverWith[String]{ case _ => Future { "error!" } }
          }
        }
      }
    } 
  }
}

我将complete函数放在detach指令中。

文档解释分离将:execute the inner route inside a future.

效果角度来看,使用(或不使用)detach的重要性是什么?

我查看了这个相关的answer,但它侧重于如何使用分离。

2 个答案:

答案 0 :(得分:4)

通常需要

HttpRequest,因为路由在actor中同步运行。这意味着在路由Future时,actor不能同时处理任何其他消息。

但是,使用FutureDirectives或使用detach之一完成异步路由位也会释放原始路由参与者以获取新请求。

因此,如果路由本身是瓶颈或您同步完成请求,则添加Future可能会有所帮助。在上面的例子中,您已经完成了detach并且具有相对简单的路由结构,在这种情况下添加detach将无济于事(或者甚至可能引入一点点延迟)。

另外,detach附带了一些您在此处可以阅读的不一致之处:

使用detach的替代方法是使用per-request-actors。

在akka-http中,路由在Futures之上实现,尽可能不同步,不再局限于演员,因此不需要{{1}},因此被删除。

答案 1 :(得分:0)

如果没有分离喷雾将逐个处理所有请求,而分离它将并行处理它们。如果您可以并行处理此请求,则最好使用分离以获得更好的性能。