gpt4 book ai didi

c# - 将消息移至 azure servicebus 中的 'deadletter '

转载 作者:行者123 更新时间:2023-12-02 08:28:49 24 4
gpt4 key购买 nike

我已经实现了退避指数重试。所以基本上,如果有任何异常,我会克隆消息,然后通过添加一些延迟将其重新提交到队列。

现在我面临两个问题 - 1)我发现当我克隆并重新提交回队列时,交付计数没有增加2) 如果达到最大传递计数,我想将其移至死信。

代码:

catch (Exception ex)
{
_logger.Error(ex, $"Failed to process request {requestId}");
var clone = messageResult.Message.Clone();
clone.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(45);

await messageResult.ResendMessage(clone);
if (retryCount == MaxAttempts)
{
//messageResult.dea
}
return new PdfResponse { Error = ex.ToString() };

}

请帮我解决这个问题

最佳答案

当您克隆一条消息时,它会成为一条新消息,这意味着系统属性不会被克隆,这会为克隆的消息提供一个从 1 开始的新传递计数。另请参阅https://docs.azure.cn/zh-cn/dotnet/api/microsoft.azure.servicebus.message.clone?view=azure-dotnet

您可以查看 Azure 服务总线的Peek Lock 功能。使用 PeekLock 时,消息在队列中变得不可见,直到您显式放弃它(将其放回队列并增加传递计数)或在处理消息时一切按预期进行时完成。另一种选择是明确地死信此消息。

该功能记录在此处:https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock

但重要的是,如果您不执行上述任何操作,例如克隆 Azure 服务总线将在定义的时间间隔(LockDuration 属性)后或当您放弃消息时自动使消息再次可见

因此,要获得延迟重试和死信行为(当达到最大传递计数时),您可以使用以下选项:

选项 1.通过 Azure 服务总线自动解锁重试

当由于某种原因无法执行消息处理时,捕获异常并确保不执行任何提到的操作(放弃、完成或死信)。这将使消息在剩余时间内不可见,并在达到配置的锁定持续时间后再次可见。正如预期的那样,Azure 服务总线的交付数量也会增加。

选项 2. 实现您自己的重试策略

在代码中执行您自己的重试策略并重试消息处理。如果已达到最大重试次数,请放弃该消息,这将使其在达到重试时间后的下一个队列读取步骤中再次可见。在这种情况下,交付数量也会增加。

注意:如果您选择选项 2.),请确保您的重试周期符合定义的 LockDuration,以便您的消息在以下情况下不会再次在队列中可见:您仍在通过重试来处理它。您还可以通过在重试之间的消息上调用 RenewLock() 方法来更新重试之间的锁定。

如果您在代码中实现重试策略,我建议您使用 Polly .Net,它已经为您提供了强大的功能,例如重试和断路器策略。请参阅https://github.com/App-vNext/Polly

关于c# - 将消息移至 azure servicebus 中的 'deadletter ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62860726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com