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

And*_*eas 3 heroku playframework-2.0

我有一个Play 2.x应用程序在Heroku上运行并使用单个web 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

这适用于一个网络dyno,但我很想知道如果我调高网络动态数量会发生什么.onStart会用两个web dynos执行两次吗?

如果Global真正在全球范围内运作并且onStart只执行一次,与web dynos的数量无关,那将会很棒.如果没有,多个dynos必须以某种方式同意一个负责这项工作的dyno.

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

Naa*_*old 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),咨询锁定是一个不错的选择.