2015-07-12 94 views
1

鉴于以下喷码:喷雾的`detach`指令

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,但它专注于如何使用detach。

回答

4

detach通常是需要的,因为路由在actor中同步运行。这意味着虽然路由HttpRequest,但演员不能同时处理任何其他消息。

但是,像异步完成Future或使用FutureDirectives之一的异步路由位也将释放原始路由参与者以处理新请求。

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

此外,detach附带了一些不一致的地方,你可以读到这里:

使用detach的方法是使用每个请求的演员。

在akka-http中,路由在期货之上被实现为尽可能异步,并且不再限于演员,因此不需要detach并因此被删除。

+0

试图理解你的前几句话 - 不会使用'detach'并在'route'内部调用'Await.result'结果一次只处理一个HTTP请求,即同时由web应用程序处理? –

+0

https://groups.google.com/forum/#!topic/spray-user/ml3auuHoq_4 –

+0

这里也要回答:是的,的确如此。如果没有使用异步指令,阻塞路由结构将阻止异步路由处理。 – jrudolph

0

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

+0

你说的是,没有'detach',喷雾网络服务器会一次处理一个HTTP请求,即它不能同时处理多个请求。你能否提供一个资料来源? –