6

我很难理解与 QueueClients 一起使用的 RetryExponential 类(我也假设 SubscriptionClients)。

这里列出了这些属性,但我认为我对它们的描述的解释是不正确的。

这是我的解释...

    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 分钟重试一次。但是,我根本看不出这种解释是指数的。

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

4

1 回答 1

11

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

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

它总是会重试到 maxRetryCount,在您的情况下为 10,除非首先达到终止时间缓冲区限制。

它也不会尝试比终止时间缓冲区更长的时间,在您的情况下为 90 秒,无论它尚未达到最大重试次数。

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

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

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

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

可悲的是,我认为您必须编写自己的指数回退代码以进行实际处理。虽然有很多例子。

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

于 2013-08-29T01:08:48.227 回答