2013-03-07 60 views
3

我有一个播放2.x应用程序启动并在Heroku上运行一个单一的网络动态。玩2 Heroku启动与多个dynos

启动时,会触发一个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) 
    } 
} 

这工作正常使用一个Web测功机,但我很想知道,如果我打开了网页DYNOS的数量会发生什么。 使用两个web dynos将onStart执行两次吗?

将是巨大的,如果全球真正起作用的全球和在onStart只执行一次,独立的网络DYNOS的数量。如果不是这样,多个dynos必须以某种方式同意负责做这项工作的一个dyno。

有没有人遇到类似的问题?

+0

寻找解决的办法。你最后是什么? – Mik378 2014-03-05 10:50:11

回答

5

如果您运行两个Web dynos,您的全局将被执行两次。全球化在这个过程中是全球化的扩展Web进程时,您正在运行两个进程。你有几个选项:

  • 使用一个不同的进程(又名单身进程)来运行你的全局。关于Play的好处是可以有多个GlobalSettings实现。当你开始你的程序时,你可以用-Dapplication.global=YourSecondGlobal指定你要使用的全局程序。在你的proc文件中,那么你将有singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal。启动您的web进程并singleton进程并确保singleton被缩放为1.
  • 使用分布式信号来获取锁。每个进程然后将争夺锁定 - 获胜的进程将继续进行,其他进程将失败。如果你使用Postgres(很多人在Heroku上做的),advisory lock是个不错的选择。
+0

感谢Naaman的好评!不知道ProcFiles中的'singleton'。会试试看。 – Andreas 2013-03-08 08:42:32

+0

@Naaman你不会因为这个解决方案而失去网络测试吗?由于单身人士无法处理HTTP请求(因为只有名称上带'web“的dynos) – Mik378 2014-03-05 13:16:41

+0

@ Mik378否,单身人士充当工作人员。也许令人困惑的是,这个例子包括-Dhttp.port,可能它不需要(没有测试过,看看它是否有必要)。 – 2014-03-05 21:23:24

2

您也可以在运行时得到DYNO名称:

String dyno = System.getenv("DYNO"); 

这样做检查这样也可以工作:

if(dyno.equals("web.1")) { 

}