Конфигурирование NServiceBus (с RabbitMQ Transport) для экспоненциального отката при отложенных повторных попытках - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь настроить NServiceBus для реализации экспоненциальной схемы отката для отложенных повторных попыток. Например:

1) при первой попытке отказа через 2 ^ 0 минут

2) при второй попытке отказа через 2 ^ 1 минуты

3) на третьей повторная попытка сбоя через 2 ^ 2 минуты

Я обнаружил проблему на github, которая, кажется, указывает на то, что экспоненциальный откат возможен с помощью пользовательской политики восстановления, но я не могу определить из документации Particular как этого добиться.

Может ли кто-нибудь указать мне правильное направление для настройки пользовательской политики восстановления для NServiceBus, которая обеспечит экспоненциальный откат для отложенных повторных попыток?

1 Ответ

0 голосов
/ 22 января 2020

Отредактировано для включения ответа из комментария @ saba cc

Из моего исследования 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;
}
...