1

Azure アプリケーションに関する技術的な提案が必要です。したがって、アイテムを含むキューがあり、[A、B、A、B、D] であるとしましょう。

キュー内の個別のアイテムごとにランダムなカテゴリが割り当てられ、同じアイテムがキュー内に複数回存在する可能性があります。カテゴリの割り当ては、次のことを行う一部のワーカー ロールによって行われます。アイテムに既にカテゴリが割り当てられている場合は、アイテムをカテゴリに追加します。それ以外の場合は、新しいカテゴリを作成してアイテムを追加します。したがって、次のようになります。

D: has category? no. Create category 123. Assign [D, 123]
B: has category? no. Create category 435. Assign [B, 435]
A: has category? no. Create category 154. Assign [A, 154]
B: has category? yes. Assign [B, 435] (category already created)
... etc ...

私のジレンマは、同じアイテムが 2 つのカテゴリにならないようにワーカーを同期するにはどうすればよいかということです。2 人の作業員がアイテム B を選択した場合、「B」に 2 つのカテゴリを設定できます。

4

2 に答える 2

2

重複が発生しないようにする唯一の方法は、両方のインスタンスからアクセスできるカテゴリの割り当てをロックすることです。Azureでこれを行う最も一般的な方法は、ストレージ内のBLOBをリースすることです。アイテムのタイプがFooで、FooのIDをキューに渡す場合、擬似コードは次のようになります。

int fooId = GetIdFromQueue();

Foo myFoo = LoadFooFromStorage(fooId);

if (myFoo.Category == null)
{
    CreateLockBlobIfNoExistForFoo(fooId);

    while (not GetLockOnBlobForFoo(fooId))
    {
        WaitForSomeTime();
    }

    // Need to reload the underlying item as another thread may have
    // been assigning the category while we were waiting on the lock
    Foo myFoo = LoadFooFromStorage(fooId);

    if (myFoo.Category == null)
    {
        myFoo.Category = GetRandomCategory();

        SaveFoo(myFoo);
    }

    ReleaseLease(fooId);
}

ブロブリースの詳細を調べる必要がありますが、うまくいけば、それで十分に始めることができます。

于 2013-01-03T20:09:24.880 に答える
1

ワーカー ロールがアクセスできる Azure テーブルでアイテム/カテゴリ リストを維持しますが、これは何らかの調整なしで重複する可能性があります。たとえば、スロットリングの場合、GetMessage() を適切な待機時間 (1 ~ 3 秒) でタイマー ループに設定します。GetMessage() を呼び出すたびに、PeekMessages(5) を呼び出して、次の 5 つのメッセージを表示しますが、デキューしません。GetMessage() を呼び出す前に、それらをループして未割り当ての項目をカテゴリに割り当て、Azure テーブルに格納します。

于 2013-01-03T03:33:48.493 に答える