我有一个播放(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")
}}
在我看来,线程池配置被忽略了。我在这里错过了什么?
答案 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)
我用过
激活器运行
启动服务器,似乎没有拿起线程池配置文件。使用
激活者开始
确实如此,现在似乎使用了配置文件。我现在需要测试这是否解决了我的问题。还可以查看异步调用。