配置 NServiceBus(使用 RabbitMQ 传输)以在延迟重试时实现指数退避



我正在尝试配置 NServiceBus 以实现延迟重试的指数退避方案。例如:

1( 在 2^0 分钟内重试第一次失败

时2( 在 2^1 分钟内第二次失败重试

3( 在 2^2 分钟内第三次失败时重试

我在 github 上发现了一个问题,似乎表明自定义可恢复性策略可以出现指数退避,但我无法从 Specific 的文档确定如何实现这一目标。

谁能指出我为 NServiceBus 设置自定义可恢复性策略的正确方向,以便为延迟重试启用指数退避?

已编辑以包含@sabacc评论中的答案

根据我的研究,NServiceBus 不支持开箱即用的指数退避。但是,自定义可恢复性策略允许您配置立即重试次数和延迟重试次数以及延迟重试之间的时间。

由于NServiceBus将ErrorContext对象中执行的延迟交付数作为DelayedDeliveriesPerformed,我们可以将其合并到每次延迟迭代的延迟计算中。

我为半瞬态异常(InternalServerException(的情况提供了下面的代码,该异常应该以指数退避方式进行一次立即重试和三次延迟重试。

private RecoverabilityAction RetryPolicy(RecoverabilityConfig config, ErrorContext context)
{
var delay = Math.Pow(10, context.DelayedDeliveriesPerformed);
var semiTransientConfiguration = new RecoverabilityConfig(
new ImmediateConfig(1), 
new DelayedConfig(3, TimeSpan.FromSeconds(delay)),
config.Failed);
if (context.Exception is InternalServerException)
{
var action = DefaultRecoverabilityPolicy.Invoke(
semiTransientConfiguration, context);
}
return action;
}

最新更新