programing

Azure SB 메시지를 삭제하여 나중에 다시 볼 수 있도록 하는 올바른 방법은 무엇입니까?

iphone6s 2023. 5. 22. 20:49
반응형

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

반응형