3

我很难理解与QueueClients一起使用的RetryExponential类(并且我也假设SubscriptionClients)。ServiceBus重试指定的属性含义

该属性列出here,但我不认为我的解释他们的描述是正确的。

这里是我的解释......

var minBackoff = TimeSpan.FromMinutes(5); // wait 5 minutes for the first attempt? 
    var maxBackoff = TimeSpan.FromMinutes(15); // all attempts must be done within 15 mins? 
    var deltaBackoff = TimeSpan.FromSeconds(30); // the time between each attempt? 
    var terminationTimeBuffer = TimeSpan.FromSeconds(90); // the length of time each attempt is permitted to take? 
    var retryPolicy = new RetryExponential(minBackoff, maxBackoff, deltaBackoff, terminationTimeBuffer, 10); 

我工作者的角色只是试图在即使我认为基于配置过去一小时内处理掉队列中的消息的两倍以上,应该更频繁地熄灭(每30秒+在先前尝试达90秒期间使用的任何处理时间)。我认为这些设置会每2分钟强制一次重试。但是,我不明白这个解释是如何根据指数的。

我的解释是否对每个房产(在上面的评论中)是正确的?如果不是(我认为他们不正确),每个属性意味着什么?

回答

7

如您所怀疑的,您包含的值对于这些参数的含义没有意义。以下是我对这些参数的理解:

  • DeltaBackoff - 用于按指数增加重试间隔的间隔。
  • MaximumBackoff - 您希望重试之间的最大次数。
  • MaxRetryCount - 系统重试操作的最长时间。
  • MinimalBackoff - 重试之间所需的最短时间。
  • TerminationTimeBuffer - 系统在放弃前重试操作的最长时间。

它总是会重试到maxRetryCount,在你的情况10中,除非terminateTimeBuffer限制先被命中。

它也不会尝试超过终止时间缓冲区,在您的情况下是90秒,无论它还没有达到最大重试次数。

minBackoff是您在重试之间等待的最少时间,maxBackoff是您希望在重试之间等待的最长时间。

DeltaBackOff值是每个重试内部按指数增长的值。请注意,这不是确切的时间。它会随机选择一个比这次少一点或多一点的时间,以便多个线程全部重试都不会在同一时间完成。它的随机性使这一点错开了。在第一次实际尝试和第一次重试之间,只有minBackOff间隔。由于您将deltaBackOff设置为30秒,因此如果再次尝试,则大约需要30秒加上minBackOff。第三次重试将是90秒加上minBackOff,以此类推,直到它达到最大回退。

我要确保指出的一件事是,这是一个重试策略,意味着如果操作收到异常,它将遵循此策略再次尝试。如果Retrieve,Deadletter,Defer等操作失败,那么这个重试策略就会启动。这些是针对服务总线的操作,而不是您自己处理中的异常。

我可能错了,但我的理解是,这并不直接关系到实际收到的消息进行处理,除非接收的呼叫失败。连续处理通过Receive方法和您自己的代码循环来处理,或者通过使用OnMessage操作(后台也使用Receive)来处理。只要没有错误实际尝试接收,则此重试策略不会得到应用。在接收调用之间使用的时间间隔由您自己使用接收方法(需要一个时间范围)或者在创建queueClient对象之前设置MessagingFactory.OperationTimeout来设置。如果接收呼叫达到了等待的限制,则可能是因为您使用了在接收时提供时间范围的重载,或者它达到了默认值,则返回空值。这不被视为例外,因此重试策略不会生效。

不幸的是,我认为您必须为实际处理编写自己的指数函数。虽然有很多例子。

是的,您可以在QueueClient和SubscriptionClient上都设置此重试策略。

+1

迈克你断言接收不参加重试是正确的。接收操作将返回null或消息,然后需要再次调用以接收下一条消息。重试策略用于处理错误并重试这些操作,例如完成消息,发送消息或创建队列等。 –

+0

@MikeWo每个文档和人员都会谈论MaximumBackoff,但是它的价值是什么?你知道价值吗? –

+0

@NuriYILMAZ MaximumBackoff是一个时间跨度。默认情况下,服务总线的重试策略由RetryPolicy.Default设置,它使用30秒的MaximumBackoff。如果您将其设置为其他内容,则希望使用在检查队列进行工作时愿意等待的时间最长的值。 – MikeWo