【问题标题】:Configuring NServiceBus (with RabbitMQ Transport) for exponential backoff on delayed retries为延迟重试的指数退避配置 NServiceBus(使用 RabbitMQ 传输)
【发布时间】:2020-01-20 14:51:17
【问题描述】:

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

1) 2^0 分钟后第一次失败重试

2) 2^1 分钟内第二次失败重试

3) 2^2 分钟内第三次失败重试

我在 github 上发现了一个 issue,这似乎表明使用自定义可恢复性策略可以实现指数退避,但我无法从 Particular 的文档中确定如何实现这一点。

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

【问题讨论】:

    标签: rabbitmq nservicebus retry-logic exponential-backoff


    【解决方案1】:

    已编辑以合并来自@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;
    }
    

    【讨论】:

    • 自定义可恢复性策略应该允许您实施指数退避策略。但是,您必须将计算的时间跨度传递给RecoverabilityAction.DelayedRetry 方法。您可以根据传递给自定义可恢复性策略的 ErrorContext 访问之前的重试次数来确定时间跨度。
    • @Sabacc 这行得通,谢谢!如果您想将您的评论扩展到答案,我可以为您提供答案。否则,我会将您的评论合并到我上面的答案中。
    • 请随意将其合并到您的答案中,我目前没有好的代码示例可供分享。如果你已经让它工作了,那是完美的分享:)
    • @sabacc 谢谢!为清楚起见,请随时进一步编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多