在 azure servicebus 中将消息移动到 'deadletter '
Move message to 'deadletter ' in azure servicebus
我已经实现了退避指数重试。所以基本上,如果有任何异常,我会克隆消息,然后通过添加一些延迟将其重新提交到队列。
现在我面临 2 个问题 - 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 时,消息在队列中不可见,直到您明确放弃它(将其放回队列并增加传递计数)或如果在处理消息时一切按预期进行时完成。另一种选择是明确地死信此消息。
但重要的是,如果您不执行上述任何操作,例如克隆 Azure 服务总线将自动使消息再次可见间隔(LockDuration 属性)或当你放弃它时。
因此,要获得延迟重试和死信行为(当达到最大传递计数时),您可以使用以下选项:
选项 1. 通过 Azure 服务总线自动解锁重试
当由于某种原因暂时无法处理消息时,捕获异常并确保执行 none 提到的操作(放弃、完成或死信)。这将使消息在剩余时间内不可见,并在达到配置的锁定持续时间后使其再次可见。 Azure 服务总线也将按预期增加交付数量。
选项 2. 实施您自己的重试策略
在您的代码中执行您自己的重试策略并重试消息处理。如果已达到最大重试次数,则放弃该消息,这将使它在达到重试时间后再次显示以供下一个队列读取步骤使用。在这种情况下,交付计数也会增加。
注意:如果您选择选项 2。)请确保您的重试周期符合定义的 LockDuration,以便您的消息如果您仍在重试处理它,则不会再次出现在队列中。您还可以通过在重试之间的消息上调用 RenewLock() 方法来更新重试之间的锁定。
如果您在代码中实施重试策略,我建议您使用 Polly .Net,它已经为您提供了强大的功能,例如重试和断路器策略。参见 https://github.com/App-vNext/Polly
我已经实现了退避指数重试。所以基本上,如果有任何异常,我会克隆消息,然后通过添加一些延迟将其重新提交到队列。
现在我面临 2 个问题 - 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 时,消息在队列中不可见,直到您明确放弃它(将其放回队列并增加传递计数)或如果在处理消息时一切按预期进行时完成。另一种选择是明确地死信此消息。
但重要的是,如果您不执行上述任何操作,例如克隆 Azure 服务总线将自动使消息再次可见间隔(LockDuration 属性)或当你放弃它时。
因此,要获得延迟重试和死信行为(当达到最大传递计数时),您可以使用以下选项:
选项 1. 通过 Azure 服务总线自动解锁重试
当由于某种原因暂时无法处理消息时,捕获异常并确保执行 none 提到的操作(放弃、完成或死信)。这将使消息在剩余时间内不可见,并在达到配置的锁定持续时间后使其再次可见。 Azure 服务总线也将按预期增加交付数量。
选项 2. 实施您自己的重试策略
在您的代码中执行您自己的重试策略并重试消息处理。如果已达到最大重试次数,则放弃该消息,这将使它在达到重试时间后再次显示以供下一个队列读取步骤使用。在这种情况下,交付计数也会增加。
注意:如果您选择选项 2。)请确保您的重试周期符合定义的 LockDuration,以便您的消息如果您仍在重试处理它,则不会再次出现在队列中。您还可以通过在重试之间的消息上调用 RenewLock() 方法来更新重试之间的锁定。
如果您在代码中实施重试策略,我建议您使用 Polly .Net,它已经为您提供了强大的功能,例如重试和断路器策略。参见 https://github.com/App-vNext/Polly