Rebus 2-го уровня Retry - PullRequest
       27

Rebus 2-го уровня Retry

1 голос
/ 16 мая 2019

Можно ли определить экспоненциальный откат с рандомизацией для повторной попытки ниже?

public class SomeHandler : IHandleMessages<DoStuff>, IHandleMessages<IFailed<DoStuff>>
{
    readonly IBus _bus;

    public SomeHandle(IBus bus)
    {
        _bus = bus;
    }

    public async Task Handle(DoStuff message)
    {
        // do stuff that can fail here...
    }

    public async Task Handle(IFailed<DoStuff> failedMessage)
    {
        await _bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30));
    }
}

https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handling

Например, как показано ниже: экспоненциальный откат плюс некоторое дрожание

Random jitterer = new Random(); 
Policy
  .Handle<HttpResponseException>() // etc
  .WaitAndRetry(5,    // exponential back-off plus some jitter
      retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))  
                    + TimeSpan.FromMilliseconds(jitterer.Next(0, 100)) 
  );

https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly

https://github.com/App-vNext/Polly/wiki/Retry#overall-number-of-attempts

1 Ответ

0 голосов
/ 16 мая 2019

Это так.Чтобы сделать это, нужно передать какое-то состояние в дополнительном заголовке отложенного сообщения:

var headers = new Dictionary<string, string>();

await _bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30), headers);

, например, путем подсчета попыток доставки:

var attempt = failedMessage.Headers.TryGetValue("delivery-attempt", out var x)
    ? x
    : 0;

var delay = FigureOutDelay(attempt);

var headers = new Dictionary<string, string> {
    {"delivery-attempt", (attempt+1).ToString()}
};

await _bus.Advanced.TransportMessage.Defer(delay, headers);

плюс немного большенапример, переслать в очередь недоставленных сообщений, если она продолжает отказывать слишком долго.

...