由于Netty是一个非阻塞服务器,将操作更改为使用会产生什么影响.async
?
def index = Action { ... }
与
def index = Action.async { ... }
我明白,.async
你会得到一个Future[SimpleResult]
.但是既然Netty没有阻止,那么Play会不会做类似的事情呢?
这会对吞吐量/可扩展性产生什么影响?这是一个难以回答的问题,它取决于其他因素吗?
我问的原因是,我有自己的自定义Action
,我想重置每个页面请求的cookie超时,所以我这样做是一个async
调用:
object MyAction extends ActionBuilder[abc123] { def invokeBlock[A](request: Request[A], block: (abc123[A]) => Future[SimpleResult]) = { ... val result: Future[SimpleResult] = block(new abc123(..., result)) result.map(_.withCookies(...)) } }
从上面的代码片段拿走是我使用的Future[SimpleResult]
,这类似于调用,Action.async
但这是在我的Action内部吗?
我想了解这会对我的应用程序设计产生什么影响.似乎只是为了能够在每个请求的基础上设置我的cookie,我已经从阻塞变为非阻塞.但是我很困惑,因为Netty没有阻塞,也许我真的没有改变现实,因为它已经是异步的?
或者我只是创建了另一个嵌入另一个异步调用?
希望有人能够通过一些细节来阐明这一点,以及这将在性能/吞吐量方面产生的影响.
def index = Action { ... }
是非阻塞你是对的.
目的Action.async
只是为了让您更容易Futures
在您的行动中使用.
例如:
def index = Action.async { val allOptionsFuture: Future[List[UserOption]] = optionService.findAll() allOptionFuture map { options => Ok(views.html.main(options)) } }
在这里我的服务返回一个Future
,并且为了避免处理提取结果我只是将它映射到a Future[SimpleResult]
并Action.async
处理其余的事情.
如果我的服务List[UserOption]
直接返回我可以使用Action.apply
,但在引擎盖下它仍然是非阻塞的.
如果你看一下Action
源代码,你甚至可以看到apply
最终的调用async
:https:
//github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/play/api/mvc /Action.scala#L432