2011-10-16 10 views
10

Playフレームワークの素晴らしい点の1つは、完全にステートレスであり、リクエスト/レスポンスのみであることです。これは、アプリケーションをクラウドにデプロイし、ロードバランサの背後にある再生インスタンスの数を、状態(セッション)の複製を心配することなく調整できるので、本当にいいです...Play Framework:ステートレスモデルへのジョブの影響

最近、私はHTTP要求の外でいくつかのアプリケーションロジックを実行し、Playがフレームワークによって完全に管理されているジョブを定義する可能性があることを発見しました。鮮やかに聞こえますが、Playで使用されるステートレスモデルにこれらのジョブがどのように適合するのかという疑問が生じます。

私は1時間ごとに実行する必要があるメンテナンスタスクを持っており、そのためにスケジュールされたジョブを定義します。ロード・バランサの背後に複数のPlayインスタンスをデプロイすると、そのインスタンスは各インスタンスで同時に開始されますか?もしそうなら、「排他的」に実行する必要があるジョブを処理するための良いアプローチは何でしょうか?

私は、クラスタ化されていないサーバー上に新しいプレイインスタンスを作成し、既存の(クラスタ化された)インスタンスのJPAモデルを再利用して同じデータベースに接続することを考えていました。この新しいインスタンスには保守ジョブのみが含まれ、クラスタ化されていないサーバーでホストされているため、同時にジョブが実行されるリスクはありません。同時に、これにより、既存のクラスター化されたインスタンスを完全にステートレスで、ホスト/ロードバランスが容易に保つことができます。これは良いアプローチですか?

+0

賞金の開始については、以下を参照してください。 – ripper234

答えて

5

ジョブをクラスタリングすることをお勧めします。データベースにセマフォを設定して、1つのジョブだけが実行されていることを確認できます。 もう一つのアイデアは、Play 2.0に含まれるAkka-Frameworkを見てみることです。私はそれがこの問題を処理する仕組みを構築していると思うが、わからない。私はakkaの経験はありません。

5

DBにフラグを保持すると述べたneilsは、ジョブがすでに実行中であるかどうかを調べるのに役立ちます。私は他のフラグと私に仕事の状態と追加情報を与えるためにDBセマフォを使用します。

もう1つのことは、Play.idを使用して作業を実行し、ジョブを実行するインスタンスを定義することです。


doJob(){ 
    if ("prod".equalsIgnoreCase(Play.id)) { 
    ... 
    } 
} 
+0

ありがとう!私はこれのために私のDBをロックするという考えは本当に好きではありませんが、私はあなたの提案は、ジョブが実行されているインスタンスを確認するのが好き! – stikkos

2

はに簡単に見ていたた: - 、「再生開始%のPROD1」...アプリと私のdoJobで、次の()メソッドを起動するために - 私たちは、「%PRODスタートプレイ」を使用し Play Frameworkのソースコード(クラスJobJobsPlugin)私は、ジョブがある時間間隔(醜いハックの導入なし)で一度だけ実行することが重要であるとき、これらはクラスター環境での使用には適していないと思います。

私は三つの可能な解決策を参照してください。

  1. クラスタリングをサポートしているジョブスケジューラを使用します。明白な選択はQuartzです。また、Playでは、スケルトンを使用する(CRON式を解析する)部分を使用しますが、スケジューリングを実行する部分は使用しません。

  2. Play 2を使用している場合、Akkaになる可能性があります。これはa schedulerです。

  3. 2回実行されているときは問題にならないようにジョブを変更します(いくつかのユースケースで可能です)。

+0

ええ、私たちは現在、ソリューション#1について考えています – ripper234

関連する問題