2017-02-27 4 views
0

私は1つのウェブ役割を持っています。私は起動時に初期化コードを実行します。今はN個のインスタンスが必要ですが、そのうちの1人だけが初期化コードを実行し、他のすべてのインスタンスを待機させたいと考えています。複数インスタンスのAzure Cloud Service Classicで1つのインスタンスでのみ初期化を行う方法はありますか?

マスターノード - スレーブノードのように見えます。

どうすればこの問題を解決できますか?これには既知のパターンはありますか?

答えて

0

私はこの問題がずっと前にAlexandre Briseboisによって解決されたと考えていました。彼のクラスBlob lease managerJob Reservation Serviceのうち2つを組み合わせることにより

彼が2件のブログの記事でそれをすべて説明:

  1. About leasing a blob
  2. About scheduling and reserving slot for a distributed job

私はリンクの回答はSOが、上好ましいものではないことを知っています必要なコードをすべて貼り付けてここに説明することは良い考えではありません。

1

何らかの作業をしている間にすべてのインスタンスが待機する簡単な方法は、マスターインスタンスにlease on a blob in Azure storageを置くことです。 起動時にマスタインスタンスのWorkerRole.csが、一部のAzureコンテナにBlobファイルを作成してリースします。初期化が完了するとリースを解放します。 スレーブインスタンスは起動時に同じファイルを読み込み、リースが解放されるまで待機します。それがリリースされた場合、BLOBファイルには初期化が完了したという指示が含まれている必要があります。

マスタにしたいクラウドロールのインスタンスを知っていますか?最初のアルファベット順ですか? 起動するのが最初の場合、問題はより簡単です。各インスタンスはファイルの作成/リースを試みる必要があり、1つを除いてすべてが失敗します。

それが最初のアルファベット1であれば、行う、(メモリから行く)RoleEnvironment.Instance.Idを調べて、インスタンスが任意に再起動することができますので、それが唯一の

「RoleName_IN_1」であれば、それはinitilizationコードをスピンアップ持っています再初期化しようとしないようにしてください。おそらく、最良の処理方法を考える必要があります。おそらく、何らかの種類のタイムスタンプをblobファイルに入れてください。

+0

"インスタンスはファイルを作成またはリースしようとしますが、1つを除きすべて失敗します"という問題が発生します。 - 初期化が完了した後にインスタンスNが生成され、それがわからない場合 - 初期化がすでに完了している場合、または初期化ファイルが存在し、初期化ファイルが存在し、ロックされていない場合来る最初のインスタンスが仕事をしてファイルをリリースしたからです。これは、最初の要求の後にインスタンスが生成されるため可能です。 私は、サービス自体の再起動を識別する何かが必要です。 –

+0

共通のサービスストレージまたは "信頼できる辞書"がある場合、または環境外でサービスを再起動するたびに消去または再インスタンス化されるRoleEntryPointsの間に共通のものがあれば、そのジョブを実行します。 –

関連する問題