Azure SB 메시지를 삭제하여 나중에 다시 볼 수 있도록 하는 올바른 방법은 무엇입니까?
이 시나리오에서는 SB 대기열을 사용하여 다른 서비스로의 발신 콜백을 제한합니다.다른 서비스로 전화를 다시 걸 때의 표준 문제 중 하나는 서비스가 제어할 수 없는 시간 동안 중단될 수 있다는 것입니다.대상이 다운되었거나 응답하지 않는 것을 감지한 경우 메시지가 대기열에 즉시 다시 나타나지 않도록 메시지를 버리는 가장 좋은 패턴은 무엇입니까?
다음은 제가 알고 있거나 시도했거나 고려 중인 몇 가지 접근 방식입니다.
분명히 내가 그냥 사용한다면.
BrokeredMessage::Abandon()메시지가 잠금 해제되고 다시 대기열에 표시됩니다.이것은 분명히 이 시나리오와 제가 피하려고 하는 것에 바람직하지 않습니다.오류가 발생했다는 사실을 무시하고 포기를 호출하지 않으면 오류가 즉시 표시되지 않습니다. 하지만 다시 표시될 때까지 시간을 세부적으로 제어할 수 없기 때문에 쇠퇴하는 재시도 전략을 구현하고 싶습니다.
제가 전화할 수 있을 것 같아서요
BrokeredMessage::Abandon(IDictionary<string, object>)그리고 어떻게든 업데이트합니다.ScheduledEnqueueTimeUTC속성, 하지만 저는 이것을 시도해 보았지만 메시지의 처음 전송 외에는 해당 속성에 영향을 줄 방법이 없는 것 같습니다.일리는 있지만, 시도해 볼 가치가 있는 생각입니다.저는 그냥 사용하는 것을 고려했습니다.
BrokeredMessage::Complete()이 상황에서 그리고 실제로 메시지의 새로운 사본을 큐잉합니다.ScheduledEqueueTimeUTC재산의 집합
마지막 총알은 거의 너무 무거운 것처럼 보이지만, 저는 그것이 아마도 줄의 본질적인 특성을 고려할 때 정답일 것이라는 결론에 도달하고 있습니다.제가 놓치고 있는 Azure SB 대기열에서 더 좋은 방법이 있을 것 같아서요.
메시지를 잠시 보관하고 싶을 때 시퀀스 번호를 기록할 장소(세션 풀 대기열에서 세션 상태일 수 있음)가 있으면 메시지를 연기()할 수 있습니다.지연된 메시지는 시퀀스 번호를 지정하는 특수 수신 오버로드를 사용하여 검색할 수 있습니다. 만료되는 메시지 이외에 다시 수신할 수 있는 유일한 방법도 있으므로 주의하십시오.이 기능은 워크플로우 및 상태 컴퓨터를 위해 구축되어 순서에 맞지 않는 메시지 도착을 처리할 수 있습니다.
위의 2번 글머리 기호:전화할 때 메시지에 TTL 시간 범위를 설정할 수 없습니다.Receive(TimeSpan) 값대신 Receive()그런 다음 메시지를 쉽게 버릴 수 있습니다(전화하지 않고).Abandon()), TTL이 만료되면 메시지가 대기열에 다시 나타납니다.이렇게 하면 "x초 후에 다시 표시"라고 말할 수 있는 세부적인 제어 기능은 제공되지 않지만 메시지가 다시 표시되는 시기를 예측할 수 있습니다.
참고: 저장소 기반 대기열을 사용하면 보이지 않는 시간 제한을 업데이트하여 메시지 재등장을 위한 세부적인 제어 기능을 제공할 수 있습니다.
좀 촌스럽게 느껴지지만, 제가 생각해 낸 해결책은
try
{
...
}
catch (Exception ex)
{
await Task.Delay(30000);
throw;
}
이렇게 하면 30초 동안 기다렸다가 포기할 수 있습니다.구성된 시간이 지나면 최종적으로 데드 레터가 됩니다.
저는 수신을 위해 Azure Webjobs를 사용하고 있습니다. 저는 만지중이용을 사용하고 ,Task.Delay에 Thread.Sleep대기열에서 다른 항목을 처리하는 동안 스레드가 대기열에서 해방되지 않는 것 같습니다(기본적으로 웹 작업은 병렬로 16개를 처리함).
내가 당신이라면 인터넷에 있는 많은 엔터프라이즈 통합 패턴 페이지 중 하나를 참조하여 해결책을 찾았을 것입니다.기본적으로 실패할 경우 메시지를 배달 실패 대기열로 보내는 재시도를 수행합니다.이 메시지는 나중에 다시 입력할 수 있습니다.요구 사항에 따라 수동 또는 자동화될 수 있습니다.
제가 보내드린 페이지는 낙타와 관련된 페이지이기 때문에 java 페이지에 설명된 모든 내용이 .NET과 zure에 적용된다는 점을 유의하시기 바랍니다.만약 당신이 http://www.eaipatterns.com/ 에 관심이 있다면 여기에 더 많은 .NET이 있습니다.
Azure 서비스 버스의 내장된 기능을 사용하는 가장 간단한 솔루션인 것 같아 마지막 방법을 선호합니다.
흐름은 다음과 같습니다.
var newMessage = new BrokeredMessage();
// Copy message body and properties from original message...
var scheduleTimeUtc = DateTimeOffset.UtcNow.Add(...);
await queueClient.ScheduleMessageAsync(newMessage, scheduleTimeUtc);
await originalMessage.CompleteAsync()
메시지 재큐 솔루션에는 한 가지 문제가 있습니다(지금까지 가장 좋은 솔루션인 것 같습니다).새 메시지는 성공적으로 처리된 경우에도 다른 가입자에게도 전달되므로 주제/다중 가입자 모델에서는 효율적으로 작동하지 않습니다.
Delivery, 원와메면 ID적시래배수추려Message.UserProperties새 메시지에 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/16289605/whats-the-proper-way-to-abandon-an-azure-sb-message-so-that-it-becomes-visible
'programing' 카테고리의 다른 글
| 'div'의 알려진 속성이 아니므로 'ngIf'에 바인딩할 수 없습니다. (0) | 2023.05.22 |
|---|---|
| sh와 bash의 차이 (0) | 2023.05.22 |
| node.js에서 HTTP POST 요청은 어떻게 이루어집니까? (0) | 2023.05.22 |
| SQL Server 데이터베이스에서 가장 큰 개체를 찾는 방법은 무엇입니까? (0) | 2023.05.22 |
| OpenMappedExe구성 대OpenExe 구성 (0) | 2023.05.22 |