使用Action.async有什么影响,因为Play使用非阻塞的Netty

 restVerify 发布于 2023-01-09 17:56

由于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没有阻塞,也许我真的没有改变现实,因为它已经是异步的?

或者我只是创建了另一个嵌入另一个异步调用?

希望有人能够通过一些细节来阐明这一点,以及这将在性能/吞吐量方面产生的影响.

1 个回答
  • 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

    2023-01-09 17:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有