Azure 서비스 버스 대기열에서 장기 실행 메시지를 처리하는 중 이상한 동작이 나타납니다. 상당히 큰 데이터 세트를 실행하면서 잠금을 갱신하고 있으며이 특정 메시지는 일반적으로 완료하는 데 약 1 시간이 걸립니다. 이 프로세스는 훌륭하게 작동하며 이 UTC 자정을 넘지 않는 한 완료됩니다. 자정 UTC에Azure 서비스 버스 대기열 메시지 잠금은 UTC 자정에 만료됩니다.
방은, 우리의 과정에서 예외가 발생합니다 :
Microsoft.ServiceBus.Messaging.MessageLockLostException : 공급 잠금이 유효하지 않습니다. 잠금이 만료되었거나 메시지가 이미 큐에서 제거되었습니다.
우리는이 밤에 밤을 재현 할 수 있으며, 자정이 지난 후에는 프로세스가 실행되지 않습니다.
메시지 잠금 "ExpiresAtUtc"타임 스탬프 계산이 언젠가 정상적으로 넘어가는 것을 처리 할 수 있습니까?
---- UPDATE ---- 도움이 될 수 있습니다
일부 자세한 내용 :
장기 실행 프로세스가 RenewLock
를 호출하여 큐에 다시 볼 수지고에서 메시지를 유지합니다. 이 처리가 자정에 계속되면 대기열에서 메시지가 표시되고 처리가 다시 시작됩니다. 메시지는 삭제되지 않고 배달되지 않은 편지 대기열로 이동하지 않습니다. 잠김이 만료되고 메시지가 대기열에 다시 표시되어 프로세서에서 처리를 시작하고 프로세스가 다시 시작됩니다. 프로세스가 UTC 자정을 넘지 않는 한 프로세스가 성공적으로 완료됩니다. 큐
연결 :
private QueueClient GetQueue<TMessage>() => QueueClient.CreateFromConnectionString(this.configSection.Value.ConnectionString, typeof(TMessage).Name, ReceiveMode.PeekLock);
인큐 메시지 :
using (var brokeredMessage = new BrokeredMessage(message) {ContentType = "application/json"})
{
await GetQueue<TMessage>().SendAsync(brokeredMessage).ConfigureAwait(false);
}
큐에서 메시지를
여기에 코드 조각은 우리가 큐에서/인큐/디큐를 연결하기 위해 사용하고 있습니다 :
GetQueue<TMessage>().OnMessageAsync(
async msg =>
{
TMessage body = null;
try
{
body = msg.GetBody<TMessage>();
await handler.HandleMessageAsync(body, msg.RenewLockAsync).ConfigureAwait(false);
await msg.CompleteAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
await msg.AbandonAsync().ConfigureAwait(false);
}
},
new OnMessageOptions
{
AutoComplete = false
}
);
다음은 Azure Service Bus Metrics - Successful Requests의 스크린 샷입니다. 자정에 UTC + 1 시간대이므로 오전 1시에 자정에 표시합니다. 무언가 대기열에 영향을줍니다 :
가 내부 기록의 화면이며, 처리는 중지하고 이후 다시 시작 잠깐 위에 - 로크가 만료 메시지가 촬상되어, 다시 큐 상에 표시 될 때 프로세서에 의한 업그레이드 :
_ 메시지 잠금 "ExpiresAtUtc"타임 스탬프 계산이 하루를 넘어서 정상적으로 넘어가는 것을 처리하지 못합니까? _ 그렇게 생각하지 마십시오. 당신이 간단한 repro를 공유 할 수 있다면 좋을 것입니다. –
안녕하세요 @SeanFeldman - 좀 더 많은 정보를 추가했습니다. 이게 도움이 되나요? – codefrenzy
흥미 롭습니다. 차트를 보면 2 분 동안 연결이 끊어지는 것 같습니다. 잠금 갱신은 클라이언트 작업이므로 클라이언트가 서버에 연결하지 못하면 잠금이 손실되고 다른 인스턴스에서 메시지를 사용할 수있게됩니다. 잠금 기간이 최대 (5 분)로 설정된 경우 잠금 갱신은 그보다 일찍 수행됩니다. 대기열에 설정된 잠금 기간은 무엇입니까? 또한, ASB 클라이언트의 어떤 버전을 사용하고 있습니까? –