2014-11-20 6 views
3

많은 작업을 작은 작업으로 나누는 시스템을 개발하고 있습니다. Azure Service Bus 큐에 작은 작업을 작업/메시지로 추가하고 있습니다.Azure 서비스 버스 - 특정 메시지 삭제

나는 X 수의 작업자 역할을 가지고 대기열을 확인하고 데이터를 처리합니다.

메시지를 처리하고 완료 한 다음 동일한 메시지를 다시 추가하지만 X 분 시간 동안 예약하는 것이기 때문에 큐에 많은 메시지가있을 것으로 예상하지는 않습니다. 이렇게하면 이러한 작업을 계속 처리 할 수있는 루프가 생깁니다.

Azure 기능의 장점은 모든 서버 측 항목을 처리한다는 것입니다. 단점은 때때로 데이터를 디버깅하거나 조작하기 어려울 수 있다는 것입니다.

내가 할 수 있기를 원하는 것은 웹 인터페이스에서 대기열에있는 메시지 목록 (PeekBatch를 사용하여 수행 한 것)을 제시하는 것입니다. 그런 다음 일부 또는 전체 메시지를 선택하고 삭제할 수 있기를 원합니다.

코드에 버그가 있고 특정 유형의 메시지를 중지하려는 경우이 작업을 수행 할 수 있습니다.

그 다음에는 웹 페이지에서 메시지를 다시 추가하는 기능이 있습니다. 아마도 작업자 역할과 메시지를보다 빠른 속도로 수행 (또는 느리게)하거나 삭제 한 메시지를 다시 추가하려고 할 수 있습니다.

그래서 질문은 실제로 대기열에서 특정 메시지를 선택한 다음 삭제할 수 있습니까? 내가 볼 수 있듯이이 작업을 수행 할 분명한 방법은 없으며 가능하다면 일종의 해결 방법이 필요합니다. 이것은 나에게 기괴한 소리가 난다.

편집 : 작동 뭔가있어,하지만 정말 좋은 솔루션을하지 않는 것

:

public void DeleteMessages(List<long> messageIds) 
    { 
     foreach (var msg in Client.ReceiveBatch(100)) 
     { 
      if (messageIds.Contains(msg.SequenceNumber)) 
       msg.Complete(); // Deletes the message 
      else 
       msg.Abandon(); // Puts it back in the queue 
     } 
    } 

이 큐 큰 적게 효율적으로 얻을 수 있지만 것 delete 호출이 진행되는 동안 최소한 모든 활동을 중지하고 지정된 메시지를 삭제합니다.

또한 처리 할 준비가 된 메시지 만 삭제합니다. 앞으로 메시지가 무시 될 것이므로 "Sleep"메시지를 추가하는 기능을 추가하여 메시지가 "준비"되고 삭제할 수있을 때까지 큐 처리를 중단합니다.

저는 Microsoft에서 현재 API를 사용하여 몇 달 내에 사용할 수있는 특정 메시지를 삭제할 것이라고 알려 왔습니다. 그때까지는 해결 방법이 전부입니다.

유월 업데이트 :

아직도이 문제와 위의 방법들에 대한 Microsoft로부터 업데이트는 이상적이지 없었다.지금 내 코드를 수정 한 그래서 : 나는 메시지에 넣어 개체는 새 속성이

:이 널 (NULL) GUID입니다

Guid? MessageId { get; set; } 

참고 그냥 이전 버전과 호환되도록을

때 메시지를 삭제하고 싶습니다. MessageId를 데이터베이스 테이블 "DeletedMessage"에 추가합니다.

메시지 처리와 관련하여 DeletedMessage 테이블에서 일치하는 Guid를 찾고 정상적인 처리를 수행하지 않고 단순히 메시지를 완료()합니다.

이 방법은 정상적으로 작동하지만 약간의 오버 헤드가 있습니다. 엄청난 양의 메시지를 다루지 않는다면 큰 문제는 아닙니다.

또한 원래 SequenceNumber를 사용하여이 작업을 수행했음을 유의하십시오. 그러나 (기괴하게) SequenceNumber는 메시지 청취와 검색 사이에서 변경됩니다! 위와 같이 자신의 ID를 사용하지 않으면 아이디어가 작동하지 않습니다.

답변

0

일부 메시지 기준에 따라 메시지를 청취하고 포기하거나 커밋하는 메시지 수신기가있는 자체 큐 정리 프로그램을 만들 수 있습니다. 실제 생산 환경에서 세척 필요성을 미리 예상 할 경우 컨트롤러에서의 조치가 될 수 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 메시지를 들여다보고 메시지를 보려고 할 때마다 (완료, 취소, 지연) 항상 상황에서 아무 것도 할 수 없다는 오류가 표시됩니다. – McGaz

0

내 실험에서 메시지 대기열에서 활성 메시지를 삭제할 수 없습니다.

지연된 메시지는 Receive(sequenceNumber)을 호출 한 다음 Complete()을 호출하여 제거 할 수 있습니다.

예약 된 메시지는 CancelScheduledMessageAsync(sequenceNumber)을 호출하여 제거 할 수 있습니다.

활성 메시지의 경우 특정 시점에 해당 메시지가 대기열에 있는지 확인해야합니다.

데드 레터 큐의 메시지는 나중에 삭제되거나 다시 제출 될 수 있습니다.