2012-05-02 3 views
4

작업자가 큐에서 메시지를 처리하지 못하면 다시 볼 수있게되고이 (멱등 원)에 대해 코드를 작성해야한다는 것을 알고 있습니다. 그러나 작업자가 메시지를 두 번 큐에서 꺼낼 수 있습니까? 내 로깅을 기반으로, 나는이 행동을보고있는 것 같아요. 왜 그런지 모르겠습니다. 나는 심지어 다음 메시지를 얻으려고하는 사이에 메시지를 지우고있다. 그리고 나는 그것을 다시 얻은 것처럼 보인다.하늘색 저장 대기열에서 메시지를 두 번 가져올 수 있습니까?

+1

두 번 보내지 않겠습니까? 일단 메시지를 삭제/축약 해제하면 제거됩니다. – SliverNinja

+1

메시지를 대기열에 넣었을 때 대기열에 두 번 대기하는 것을 볼 수 없다는 것을 기록한 로그를 빗어 냈습니다. 그러나 누락 된 것이 있습니다. 더 많은 로깅을 추가하고 조금 더 생각해 볼 시간. 감사합니다 – Bryan

+1

그리고 거기에 당신이 간다 - 벌레없이 한 경우에 두 번 큐잉하는 것이 내 측면의 버그였다. – Bryan

답변

0

두 번 대기열을 해제 할 수 없습니다. 그리고 물건을 제대로 호출하면 두 번째 삭제 및 잠금 후에 팝 영수증이 변경되어야하므로 두 번 삭제하더라도 불가능합니다.

SilverNinja가 암시 하듯이, 아마도 메시지가 부주의로 두 번 대기했는지 확인하려고합니다.

0

두 명 이상의 작업자 역할이 있습니까?

큐 항목 가시성에 대한 시간 초과가 역할 처리를 끝내기 전에 종료 될 수있는 프로세스가 특히 오래 걸릴 수 있습니다. 이 경우 동일한 역할 (동일한 메시지가 여러 번 처리되는 경우 문제가되지 않기를 바라는)이 동일한 역할을 수행 할 수 있습니다.

이 시점에서 첫 번째 역할은 메시지를 완료하고 축약 해제 한 다음 제한 시간 후에 그 메시지를 선택하는 다른 역할이 끝나고 메시지의 축약을 해제하려고 시도합니다. 내 머리 꼭대기에서 역할이 이미 대기열에서 제외 된 메시지를 대기열에서 제외하려고 시도 할 때 정확히 어떤 일이 발생했는지를 기억하지 못합니다.

+0

예 - 두 명의 작업자 인스턴스가 있습니다. 그러나, 내 작업은 오랜 시간이 아니라 매우 빠릅니다. GetMessage 및 Delete와 거의 같은 것입니다. 그러나 위의 내용을 토대로 스케줄링 버그 또는 그럴 가능성이 더 높습니다. 내가 큐에서 꺼낼 때 값에 버그가 없다면 메시지가 다시 보일 수 있다고 생각하지 않습니다. 기본적으로 5 분이어야하지만 구성을 허용해야합니다.이를 검토 할 계획입니다. – Bryan

5

예, 동일한 메시지를 두 번 큐에서 삭제할 수 있습니다. 이는 다음 두 가지 이유로 발생할 수 있습니다.

  1. 작업자 A 메시지 B 및 표시되지 않는 시간 초과가 만료됩니다. 메시지 B가 다시 표시되고 작업자 C는 메시지 B를 큐에서 제거하여 작업자 A의 팝 영수증을 무효화합니다. 작업자 A가 작업을 완료하고 메시지 B를 삭제하며 오류가 발생합니다. 이것은 가장 일반적입니다.
  2. 특정 조건 (큐 폴링 빈도가 매우 높음)에서는 GetMessage에서 동일한 메시지를 두 번받을 수 있습니다. 이것은 드물게 발생하는 경쟁 조건입니다. 작업자 A와 B는 매우 빠르게 폴링하고 대기열에 동시에 도달하며 둘 다 동일한 메시지를받습니다. 이것은 높은 폴링 시나리오에서 훨씬 더 일반적 이었지만 (SDK 1.0 타임 프레임), 최근의 저장소 업데이트에서는 훨씬 희귀 해졌습니다 (최근에 이것을 볼 수는 없습니다).

즉, 작업자가 1 명 밖에없는 경우 메시지를 두 번 대기 중입니다. 1과 2는 근로자가 1 명 이상인 경우에만 발생합니다.

관련 문제