配置 NServiceBus(使用 RabbitMQ 传输)以实现延迟重试的指数退避
Configuring NServiceBus (with RabbitMQ Transport) for exponential backoff on delayed retries
我正在尝试配置 NServiceBus 以实现延迟重试的指数退避方案。例如:
1) 在 2^0 分钟后重试第一次失败
2) 在 2^1 分钟后重试第二次失败
3) 在 2^2 分钟后重试第三次失败
我在 github 上发现了一个 issue,它似乎表明使用自定义可恢复性策略可以实现指数退避,但我无法从 Particular 的文档中确定如何实现它。
谁能给我指明正确的方向,为 NServiceBus 设置自定义可恢复性策略,为延迟重试启用指数退避?
编辑以合并来自@sabacc 评论的答案
根据我的研究,NServiceBus 不支持开箱即用的指数退避。但是,Custom Recoverability 策略允许您配置立即重试和延迟重试的次数以及延迟重试之间的时间。
由于 NServiceBus 将 ErrorContext 对象中执行的延迟交付数包含为 DelayedDeliveriesPerformed
,我们可以将其合并到每次延迟迭代的延迟计算中。
我为半瞬态异常 (InternalServerException
) 的情况提供了以下代码,它应该以指数退避方式进行一次立即重试和 3 次延迟重试。
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;
}
我正在尝试配置 NServiceBus 以实现延迟重试的指数退避方案。例如:
1) 在 2^0 分钟后重试第一次失败
2) 在 2^1 分钟后重试第二次失败
3) 在 2^2 分钟后重试第三次失败
我在 github 上发现了一个 issue,它似乎表明使用自定义可恢复性策略可以实现指数退避,但我无法从 Particular 的文档中确定如何实现它。
谁能给我指明正确的方向,为 NServiceBus 设置自定义可恢复性策略,为延迟重试启用指数退避?
编辑以合并来自@sabacc 评论的答案
根据我的研究,NServiceBus 不支持开箱即用的指数退避。但是,Custom Recoverability 策略允许您配置立即重试和延迟重试的次数以及延迟重试之间的时间。
由于 NServiceBus 将 ErrorContext 对象中执行的延迟交付数包含为 DelayedDeliveriesPerformed
,我们可以将其合并到每次延迟迭代的延迟计算中。
我为半瞬态异常 (InternalServerException
) 的情况提供了以下代码,它应该以指数退避方式进行一次立即重试和 3 次延迟重试。
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;
}