scala - 使用Play.async会产生什么效果,因为Play使用非阻塞的Netty

标签 scala asynchronous playframework netty

由于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,为避免处理提取结果,我将其映射到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

关于scala - 使用Play.async会产生什么效果,因为Play使用非阻塞的Netty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166136/

相关文章:

javascript - 了解异步 javascript

templates - play框架中scala模板中的服务器端评论标签是什么?

scala - 运行一个游戏!使用新的 sbt 和 jdk 9 的项目

scala - 如何通过 Casbah 将带有列表的 Scala 对象转换为 MongoDBObject

scala - 为什么 2.10 坚持指定类型参数边界(在 2.9 中工作正常)?

scala - 创建像 TextLine 这样的 Scalding Source,将多个文件组合成单个映射器

scala - 如何更改 Play、SBT 及其插件使用的 Scala 版本?

c# - 即使我的服务器套接字已收到所有字节,为什么 SendAsync 不会在 SocketAsyncEventArgs 上引发 Completed 事件?

javascript - 是否保证事件处理程序在调用 AJAX 回调之前完成?

java - Play Framework : Submit button doesn't seem to work