5

同じ役割を実行する複数の Azure インスタンスを同期する際のベスト プラクティスについて疑問に思っていました。より正確には、複数のワーカー ロールが同じ作業単位で作業するのを防ぎたいと考えています。

Azure キューは、この問題には役立たないようです。1 つのオプションは、ロックとストアド プロシージャを含む SQL テーブルを使用することです。しかし、Azure で SQL 同期を使用するのは少し厄介なようです。

何か案は?

編集、私の詳細な(ただし単純化された問題)は次のとおりです。

  • n 個のターゲットがあります。
  • 作業単位は、指定された間隔 (たとえば 30 秒 - ただし、ターゲットごとに異なります) で各ターゲットに対して実行する必要があります。
  • m 個のワーカーがあります ( hインスタンスでホストされています)。
  • 作業単位の処理には、10 秒から 1 時間かかる場合があります。

アイデアは、作業単位を Azure キューに入れるスケジューラーがあり、 m 個のワーカーのそれぞれがこれらを読み取って処理するというものです。

問題:

  • worker1は unit1 の作業を開始します(これはtarget1に関するものです) - これには 10 分ほど時間がかかります
  • 30秒経過
  • スケジューラーはtarget1に別の作業単位を配置します。たとえばunit13です。
  • worker2は、同じtarget1に対して unit13 で作業を開始します-良くありません

いくつかのアイデアがありますが、十分に曇っていないように見えるので、この問題にどのような解決策を適用するかを知りたいです.

4

3 に答える 3

2

dunnry は的確です。キューは、複数のインスタンスが同じ作業項目で作業するのを防ぐのに最適です。を呼び出すとGetMessage、取得したメッセージは、指定した期間 (デフォルト: 30 秒) の間非表示になります。その期間中、他のリーダーはこのキュー メッセージを取得できません。

そうは言っても、処理がべき等であることを確認する必要があります。非表示期間よりも処理に時間がかかる場合、メッセージは再び表示されます。この時点で、元のリーダーはメッセージを削除できず、他のリーダーがメッセージを読むことができます (再び見えなくなります)。この場合、同じメッセージを再処理することができます。原則としてこれを回避するには、タイムアウト ウィンドウを慎重に設定する必要があります。

注: それぞれCloudQueueMessageDequeueCountプロパティがあるため、メッセージが複数回表示されたかどうかを判断できます (したがって、有害なメッセージにも対処できます)。

于 2011-08-31T19:39:52.123 に答える
0

CloudFXには、これらのシナリオの一部に使用できる PrimaryInstanceManager クラスがあります。

于 2013-02-28T12:29:47.183 に答える