1

Azure 응용 프로그램에 대한 몇 가지 제안이 필요합니다. 따라서 항목이있는 대기열이 있습니다. [A, B, A, B, D]라고 가정 해 봅시다.Azure에서 병렬 작업 동기화

대기열의 각 개별 항목에 임의의 범주가 지정되며 대기열에 동일한 항목이 여러 번있을 수 있습니다. 카테고리 할당은 다음을 수행하는 일부 작업자 역할에 의해 수행됩니다. 항목에 이미 할당 된 카테고리가 있으면 항목을 카테고리에 추가하고 그렇지 않으면 새 카테고리를 만들고 항목을 추가합니다. 그래서 같은 간다 :

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 ... 

내 dillema는 다음과 같은 항목이 두 가지 범주를하지 않도록 어떻게 노동자를 syncronize합니까? 두 명의 근로자가 B 항목을 선택하면 "B"에 대해 두 가지 범주를 가질 수 있습니다.

답변

1

작업자 역할에 액세스 할 수있는 하늘색 테이블에서 항목/카테고리 목록을 유지 관리하지만 일부 종류의 제한없이 여전히 중복으로 끝날 가능성이 높습니다. 스로틀 링의 경우, 타이머 루프에서 GetMessage()를 적절한 대기 (1-3 초)로 설정하고 GetMessage()를 호출하기 전에 PeekMessages (5)를 호출하여 다음 5 개의 메시지를 보지만 대기열에서 제외하지는 않습니다. Loop을 수행하고 GetMessage()를 호출하기 전에 할당되지 않은 항목을 범주에 할당하고 Azure 테이블에 저장합니다.

2

중복되지 않도록하는 유일한 방법은 두 인스턴스에서 액세스 할 수있는 범주 할당을 잠그는 것입니다. Azure에서이 작업을 수행하는 가장 보편적 인 방법은 저장소에있는 얼룩에 임대하는 것입니다. ,

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); 
} 

당신은 방울 임대에 대한 몇 가지 세부 사항을보고해야합니다 : 항목 유형의 푸의이고 대기열을 통해 푸의 ID를 전달하는 경우, 의사 코드는 다음과 같을 것 그러나 희망을 갖고 시작하면 충분합니다.