根据服务总线消息重试次数进行波莉重试 重试部分后备部分将这些碎片放在一起

问题描述

我目前的理解是Polly将根据定义的策略重试代码以执行。

我想做的是让Polly根据ServiceBus消息工作,所以我将重试次数提供给Polly,它将根据策略选择适当的行为-然后我可以使用适当的消息重新发布消息属性(消息ID,重试次数,消息生效的日期/时间)。

例如,我的重试策略是等待10秒(3次),然后每小时尝试(12次),然后再输入死信。

我找不到任何能告诉我这是否可能的信息。这是Polly支持的吗?

解决方法

是的,您可以执行此操作,但是您需要使用两个策略,而不仅仅是一个。

重试部分

Policy
.Handle<SomeException>()
.Or<OtherException>()
.WaitAndRetry(new[]
  {
    TimeSpan.FromSeconds(10),//after the second attempt 10 seconds penalty
    TimeSpan.FromSeconds(10),//after the third attempt 10 seconds penalty
    TimeSpan.FromSeconds(10),//after the fourth attempt 10 seconds penalty
    TimeSpan.FromHours(1),//after the fifth attempt 10 seconds penalty
    ...
    TimeSpan.FromHours(1) //after the sixteenth attempt 10 seconds penalty
  });

请记住,重试将在第一次失败尝试后开始。因此5次重试最多意味着6次尝试。

后备部分

Policy
 .Handle<WhateverException>()
 .Fallback(() => UseDeadletterQueue()); 

订购很重要,您如何组合这些政策。外层应该是后备。

将这些碎片放在一起

Policy.Wrap(fallback,retry);

fallback.Wrap(retry);

,

Poly控制用户启动的代码。当我们谈论发送消息时,它将起作用,除非您无法对发送操作失败的消息进行死信。只有代理可以对消息进行死信。

使用Azure Service Bus重试要接收的消息与Poly(重试的发起方)(或与此有关的任何第三方)不兼容。这是因为接收消息涉及经纪人设置和跟踪的DelibeyCount。如果该值在代理上更改并且设置为5,但是代码将Poly配置为重试更多,则无论如何,该消息都将变为死信。