用多个dynos玩2个Heroku初创公司

时间:2013-03-07 14:18:11

标签: heroku playframework-2.0

我在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。

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

2 个答案:

答案 0 :(得分:5)

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

  • 使用其他流程(也称为单例流程)来运行全局流程。关于Play的好处是你可以有多个GlobalSettings实现。启动流程时,指定要与-Dapplication.global=YourSecondGlobal一起使用的全局。然后,在proc文件中,您将拥有singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal。启动您的网络流程和singleton流程,确保singleton缩放为1。
  • 使用分布式信号量获取锁定。然后每个进程都将竞争以获得锁定 - 获胜的进程将继续,其他进程将失败。如果你正在使用Postgres(和Heroku一样多的人),advisory lock是个不错的选择。

答案 1 :(得分:2)

您还可以在运行时获取dyno名称:

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

所以做这样的检查也可能有效:

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

}