我正在尝试配置 NServiceBus 以实现延迟重试的指数退避方案。例如:
1) 在 2^0 分钟内第一次失败重试
2) 在 2^1 分钟内第二次失败重试
3) 在 2^2 分钟内第三次失败重试
我在 github 上发现了一个问题,似乎表明使用自定义可恢复性策略可以实现指数退避,但我无法从 Particular 的文档中确定如何实现这一点。
谁能指出我为 NServiceBus 设置自定义可恢复性策略的正确方向,该策略将为延迟重试启用指数退避?
我正在尝试配置 NServiceBus 以实现延迟重试的指数退避方案。例如:
1) 在 2^0 分钟内第一次失败重试
2) 在 2^1 分钟内第二次失败重试
3) 在 2^2 分钟内第三次失败重试
我在 github 上发现了一个问题,似乎表明使用自定义可恢复性策略可以实现指数退避,但我无法从 Particular 的文档中确定如何实现这一点。
谁能指出我为 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;
}