玩2 Heroku的启动与多个DYNOS(Play 2 Heroku startup with mu

2019-07-21 04:10发布

我有一个播放2.x的应用程序启动和运行在Heroku上有一个Web测功机。

在启动时,一个演员阿卡触发其本身的时间表未来的工作(如发送推送通知)。

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的数量会发生什么。 将在onStart与两个web DYNOS执行两次?

将是巨大的,如果全球真的作品在全球和在onStart只执行一次,独立的网络DYNOS的数量。 如果不是这样,多个DYNOS必须在负责执行工作一个赛道莫名其妙地同意。

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

Answer 1:

如果你运行两个网络DYNOS,全局将被执行两次。 Global是全球性的过程。 当您扩展您的网络过程中,你正在运行的两个过程。 你有几个选择:

  • 用不同的进程(也叫做单过程)来运行全局。 关于游戏的好处是,你可以有多个GlobalSettings实现。 当您启动过程中,指定要与使用全局-Dapplication.global=YourSecondGlobal 。 在你procfile,那么,你就必须singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal 。 启动网络进程和singleton进程,并确保singleton缩小到1。
  • 使用分布式semaphor获得锁。 然后,每个过程将比赛获得的锁 - 一个获胜将继续和其他人将失败。 如果你使用的是Postgres(因为很多人在Heroku上做的),一个咨询锁是一个不错的选择。


Answer 2:

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

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

这样做这样的检查也可能工作:

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

}


文章来源: Play 2 Heroku startup with multiple dynos