我在Heroku上运行了一个Play 2.x应用程序并使用一个网络dyno。
在启动时,会触发一个Akka actor,它会自行安排未来的工作(例如发送推送通知)。
object Global extends GlobalSettings {
override def onStart(app:Application) {
val actor = Akka.system.actorOf(Props[SomeActor])
Akka.system.scheduler.scheduleOnce(0 seconds, actor, None)
}
}
这适用于一个网络dyno,但我很想知道如果我调高网络动态数量会发生什么。 onStart会用两个web dynos执行两次吗?
如果全球真正在全球范围内运作并且 onStart 仅执行一次,与web dynos的数量无关,那将会很棒。如果没有,多个dynos必须以某种方式同意一个负责这项工作的dyno。
有没有人遇到过类似的问题?
答案 0 :(得分:5)
如果你运行两个web dynos,你的全局将被执行两次。全球是这个过程的全球性。扩展Web进程时,您正在运行两个进程。你有几个选择:
GlobalSettings
实现。启动流程时,指定要与-Dapplication.global=YourSecondGlobal
一起使用的全局。然后,在proc文件中,您将拥有singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal
。启动您的网络流程和singleton
流程,确保singleton
缩放为1。答案 1 :(得分:2)
您还可以在运行时获取dyno名称:
String dyno = System.getenv("DYNO");
所以做这样的检查也可能有效:
if(dyno.equals("web.1")) {
}