많은 작업을 작은 작업으로 나누는 시스템을 개발하고 있습니다. 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를 사용하지 않으면 아이디어가 작동하지 않습니다.
답장을 보내 주셔서 감사합니다.하지만 메시지를 들여다보고 메시지를 보려고 할 때마다 (완료, 취소, 지연) 항상 상황에서 아무 것도 할 수 없다는 오류가 표시됩니다. – McGaz