3

Play 2.xアプリを起動し、単一のWebダイノを使用してHerokuで実行しています。

起動時に、Akkaアクターがトリガーされ、それ自体が将来のジョブをスケジュールします(プッシュ通知の送信など)。

object Global extends GlobalSettings {

  override def onStart(app:Application) {
    val actor = Akka.system.actorOf(Props[SomeActor])
    Akka.system.scheduler.scheduleOnce(0 seconds, actor, None)
  }
}

これは1つのWebダイノで正常に機能しますが、Webダイノの数を増やすとどうなるか知りたいです。onStartは2つのWebダイノで2回実行されますか?

Globalが実際にグローバルに機能し、Web dynoの数に関係なく、onStartが1回だけ実行されると便利ですそうでない場合、複数のダイノは、仕事をする責任がある1つのダイノに何らかの形で同意する必要があります。

誰かが同様の問題に遭遇しましたか?

4

2 に答える 2

5

2つのWebdynoを実行すると、グローバルが2回実行されます。グローバルはプロセスに対してグローバルです。Webプロセスをスケーリングすると、2つのプロセスが実行されます。いくつかのオプションがあります:

  • 別のプロセス(別名シングルトンプロセス)を使用して、グローバルを実行します。GlobalSettingsPlayの良いところは、複数の実装を持つことができることです。プロセスを開始するときに、で使用するグローバルを指定します-Dapplication.global=YourSecondGlobal。procfileには、がありますsingleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal。Webプロセスとプロセスを開始し、 1にスケーリングされてsingletonいることを確認します。singleton
  • 分散セマフォを使用してロックを取得します。次に、各プロセスはロックを取得するために競争します。勝ったプロセスは続行し、他のプロセスは失敗します。Postgresを使用している場合(多くの人がHerokuで使用しているように)、アドバイザリロックが適しています。
于 2013-03-07T19:27:39.707 に答える
2

実行時にdyno名を取得することもできます。

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

したがって、このようなチェックを行うことも機能する可能性があります。

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

}
于 2014-03-05T22:27:35.373 に答える