Play Framework 适合异步后台处理吗?

pmi*_*hna 2 java web-applications akka playframework playframework-2.0

我将构建一个用于托管城市游戏的 Web 应用程序。

用户访问我的网站,单击“开始游戏”并在到达某个位置时开始接收一些 SMS 消息,并且必须回答它们才能获得积分。

Play 适合这种应用吗?单击“开始游戏”按钮后,某些逻辑必须按照自己的方式进行。我将如何并行检查玩家的地理位置(我有 API)?我想每约 5 秒 ping 一次播放器。并做一些逻辑。用户当然必须能够在处理他的位置、分配点、发送和接收消息等的同时使用 Web 应用程序。

总结一下:我想要一个用 Play 编写的应用程序,它在点击“开始游戏”后为游戏启动一个单独的线程,其他用户可以查看他们的数据(统计数据等),而这些线程按照游戏的方式工作逻辑。

我找到了类似工作的东西,但它们被记录在 1.2 版中。经过一番阅读,结果证明Akka现在是推荐的,但它使用和 actor 模型。

Play + Akka 是我项目的好选择吗?

dba*_*bau 5

绝对地。使用 Play 框架在单独的 ThreadPool(也称为 ExecutionContext)中设置计算非常容易。您可能想阅读此处文档,但简而言之,您将希望在Application.scala控制器文件中执行类似操作(请注意,此示例使用 Scala):

  // Async Action that's triggered when a user clicks "Start Game".
  // Runs logic in separate gameLogicContext thread pool and asynchronously returns a response without blocking of Play's default thread pool.
  def startGame = Action.async { implicit request =>

    Future {

      // ... your game logic here. This will be run in gameLogicContext

      Ok("Game started in separate thread pool") // http response

    }(Contexts.gameLogicContext) // the thread pool the future should run in.

  }
Run Code Online (Sandbox Code Playgroud)

然后你将在你的application.conf文件中设置一个单独的 gameLogicContext 线程池:

play {
  akka {
    actor {
      game-logic-context = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300 // thread pool with 300 threads
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)