2015-07-12 70 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請求,即它不能同時處理多個請求。你能否提供一個資料來源? –