4

複数のワーカーロールインスタンスに「シングルトン」モジュールを配置する方法を探しています。Azureでキューと複数のワーカーロールを使用した並列実行モデルが必要です。

アイデアは、「マスター」インスタンス、つまり新しいデータをチェックし、それをキューに追加してスケジュールし、他の誰も処理しない特別なキューからのすべてのメッセージを処理することです。読み取り/書き込みアクセス権を備えた仮想ドライブとしてBLOBストレージをマウントしました。

「マスターインスタンス」は常に1つだけです。そのマスターインスタンスが何らかの理由でダウンした場合、すでにインスタンス化されているインスタンスからの別のインスタンスが、マスターインスタンスに対して非常に迅速に「選出」される必要があります(数秒)。これは、壊れたインスタンスがAzure環境によって新しいインスタンスに置き換えられる前に発生する必要があります(約15分)。

つまり、それはある種の自己組織化された動的な環境になるでしょう。ストレージまたはテーブルのデータに基づいて、ロックをかけることを考えていました。マイクロプロセッサの用語と話すことができれば、ロックタイムアウトとある種の「ウォッチドッグ」タイマーを設定する機会。

4

1 に答える 1

5

あなたが達成しようとしていることへの一般的なアプローチがあります。

まず、マスターインスタンスです。インスタンスIDに基づいてチェックを行うことができます。かなり簡単です。「現在のインスタンス」を取得するには、RoleEnvironment.CurrentRoleInstanceが必要です。次に、 Idプロパティを、Id順に並べられたRoleEnvironment.CurrentRoleInstance.Role.Instancesの最初のメンバーから取得したものと比較します。何かのようなもの:

var instance = RoleEnvironment.CurrentRoleInstance;
if(instance.Id.Equals(instance.Role.Instances.OrderBy(ins => ins.Id).First().Id))
{
 // you are in the single master
}

ここで、「ヒーリング」/リサイクル時にマスターを選択する必要があります。RoleEnvironmentのChangedイベントを取得する必要があります。TopologyChangeであるかどうかを確認します(トポロジの変更であるかどうかを確認するだけで、トポロジを正確に変更する必要はありません)。また、トポロジの変更の場合は、上記のアルゴリズムに基づいて次のマスターを選択します。イベントのフックと変更の検出を正確に実行する方法については、このすばらしいブログ投稿をご覧ください。

追加するのを忘れました。

ロックが好きな場合-BLOBリースは、ロックを取得/チェックするための最良の方法です。ただし、RoleEnvironmentイベントと、インスタンスIDに基づく単純なマスター選択だけを使用する場合は、そのような複雑なロックメカニズムは必要ないと思います。さらに、正常に処理されるまで、すべてがキューに残ります。したがって、マスターが何かを処理する前に死んだ場合、「次のマスター」がそれを処理します。

于 2012-11-06T22:02:42.313 に答える