给出以下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,但它侧重于如何使用分离。
答案 0 :(得分:4)
HttpRequest
,因为路由在actor中同步运行。这意味着在路由Future
时,actor不能同时处理任何其他消息。
但是,使用FutureDirectives
或使用detach
之一完成异步路由位也会释放原始路由参与者以获取新请求。
因此,如果路由本身是瓶颈或您同步完成请求,则添加Future
可能会有所帮助。在上面的例子中,您已经完成了detach
并且具有相对简单的路由结构,在这种情况下添加detach
将无济于事(或者甚至可能引入一点点延迟)。
另外,detach
附带了一些您在此处可以阅读的不一致之处:
使用detach
的替代方法是使用per-request-actors。
在akka-http中,路由在Futures之上实现,尽可能不同步,不再局限于演员,因此不需要{{1}},因此被删除。
答案 1 :(得分:0)
如果没有分离喷雾将逐个处理所有请求,而分离它将并行处理它们。如果您可以并行处理此请求,则最好使用分离以获得更好的性能。