游戏应用中的性能问题

时间:2015-04-02 19:45:39

标签: scala playframework playframework-2.3

我有一个播放(2.3.0)应用程序,可以执行一些数据库查找。当有超过6个用户时,应用程序会遇到性能问题。

我已经将问题缩小到一个控制器,其动作睡眠时间为4秒。 测试客户端每500毫秒调用此操作。我可以看到前6个请求被处理,并且它停止几秒钟(直到4秒睡眠已经过去)并读取下一个6个。

另外:当我打开7个浏览器窗口时,第7个将无法加载(等待连接)。

查看documentation看起来我的问题是阻止io并使用高度同步的配置文件应该可以解决我的问题。 因此,我将此配置文件添加到我的application.conf中,但没有任何更改。

我的application.conf看起来像这样

application.context=/appname/


# Secret key
# ~~~~~
# The secret key is used to secure cryptographics functions.
# If you deploy your application to several instances be sure to use the same key!
application.secret="xxxxx"


play {
  akka {
    akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
    loglevel = WARNING
    actor {
      default-dispatcher = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300
        }
      }
    }
  }
}

和行动

  def performancetestSleep() = Action{ request => {
    Thread.sleep(4000)
    Ok("hmmm good sleep")
  }}

在我看来,线程池配置被忽略了。我在这里错过了什么?

2 个答案:

答案 0 :(得分:0)

你需要的只是一个处理4秒延迟的线程 - 一个调度程序。产生许多线程的产生打败了Play所拥有的架构的全部要点,恕我直言。然后,您可以使用计划程序创建Future[Result],并将其输入Action.async块。

现在,您并不需要实现自己的调度程序,因为Play依赖于Akka的并发性;和Akka有一个调度程序,可以完成这项工作。

import scala.concurrent.{Promise}
import scala.concurrent.duration._
import play.libs.Akka

val system = Akka.system()

def delayedResponse = Action.async {
  import system.dispatcher

  val promise = Promise[Result]

  system.scheduler.scheduleOnce(4000 milliseconds) {
    promise.success(Ok("Sorry for the wait!")) 
  }

  promise.future
}

答案 1 :(得分:0)

我用过

  

激活器运行

启动服务器,似乎没有拿起线程池配置文件。使用

  

激活者开始

确实如此,现在似乎使用了配置文件。我现在需要测试这是否解决了我的问题。还可以查看异步调用。