我很难理解与QueueClients一起使用的RetryExponential类(我也假设也是SubscriptionClients)。
列出的属性为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分钟重试一次。但是,我不明白这种解释是如何指数的。
我对每个属性的解释(上面的评论)是否正确?如果不是(我认为它们不正确),每个属性意味着什么?
答案 0 :(得分:7)
如您所料,您包含的值对这些参数的含义没有意义。以下是我对参数的理解:
除非首先命中terminationTimeBuffer限制,否则它总是会在你的情况10中重试maxRetryCount。
它也不会尝试超过terminationTimeBuffer的时间段,在你的情况下是90秒,无论它还没有达到最大重试次数。
minBackoff是您在重试之间等待的最短时间,而maxBackoff是您在重试之间等待的最长时间。
DeltaBackOff值是每个重试内部将按指数增长的值。请注意,这不是确切的时间。它会随机选择一个比这个时间少一点或多一点的时间,这样所有重试的多个线程都不会在同一时间这样做。它的随机性使这一点蹒跚而行。在第一次实际尝试和第一次重试之间,将仅存在minBackOff间隔。由于您将deltaBackOff设置为30秒,如果将其设置为第二次重试,则大约需要30秒加上minBackOff。第三次重试将是90秒加上minBackOff,依此类推,直到达到最大退避为止。
我要确保指出的一件事是,这是一个重试策略,这意味着如果某个操作收到异常,它将遵循此策略再次尝试。如果诸如Retrieve,Deadletter,Defer等操作失败,则此重试策略将启动。这些是针对服务总线的操作,而不是您自己处理中的异常。
我可能在这方面错了,但我的理解是,这与处理消息的实际接收没有直接关系,除非接收调用失败。通过Receive方法和您自己的代码循环,或通过使用OnMessage操作(后台也使用Receive)处理连续处理。只要实际尝试接收没有错误,则不会应用此重试策略。在接收调用之间使用的间隔由您自己使用接受方法设置,该方法需要一个时间间隔,或者如果您在创建queueClient对象之前设置了MessagingFactory.OperationTimeout。如果接收调用达到了它的等待限制,因为您使用了在接收上提供时间跨度的重载或者它达到了默认值,则只返回Null。这不被视为例外,因此重试政策不会启动。
可悲的是,我认为你必须编写自己的指数,以便进行实际处理。不过有很多例子。
是的,您可以在QueueClient和SubscriptionClient上设置此重试策略。