Множественный объявленный счетчик повторных попыток сброса метода UseMessageRetry в MassTransitC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Множественный объявленный счетчик повторных попыток сброса метода UseMessageRetry в MassTransit

Сообщение Anonymous »

Я использую Masstransit 8 + amazon sqs/sns, приложение работает в контейнере Windows Docker.
У меня есть один потребитель, где могут возникнуть следующие исключения: EndpointNotFoundException, TimeoutException, SocketException .
Для обработки этих исключений я использую три отдельные политики повторных попыток с разными временными интервалами.

Код: Выделить всё

builder.Services
.Configure(configuration.GetSection("MassTransit:Transports:AmazonSqs"))
.AddMassTransit(bus =>
{
bus.AddDelayedMessageScheduler();

bus.AddConsumer();

bus.UsingAmazonSqs((context, sqs) =>
{
var entityNameFormatter = new MessageNameFormatterEntityNameFormatter(new AmazonSqsMessageNameFormatter());

var options = context.GetRequiredService().Value;
sqs.MessageTopology.SetEntityNameFormatter(new PrefixEntityNameFormatter(entityNameFormatter, options.Scope));

sqs.ConfigureEndpoints(context, new KebabCaseEndpointNameFormatter(options.Scope));

sqs.UseDelayedMessageScheduler();

sqs.UseMessageRetry(r =>
{
r.Handle(typeof(EndpointNotFoundException));

r.Interval(3, TimeSpan.FromSeconds(10));
});

sqs.UseMessageRetry(r =>
{
r.Handle(typeof(TimeoutException));

r.Interval(3, TimeSpan.FromSeconds(20));
});

sqs.UseMessageRetry(r =>
{
r.Handle(typeof(SocketException));

r.Interval(3, TimeSpan.FromSeconds(30));
});
});
});
Теперь, если исключение одного типа произойдет последовательно 3 раза, политика повторной попытки обработает его правильно, т. е. исключение будет наконец выброшено после 3 повторных попыток подряд.< /p>
Проблема в том, что исключения возникают в случайном порядке - например - сначала EndpointNotFoundException, затем TimeoutException, затем SocketException и снова EndpointNotFoundException.
В этом случае счетчик попыток исключения сбрасывается. до 0 и для повторного создания исключения EndpointNotFoundException вам нужно снова подождать, пока оно не произойдет 3 подряд.
Вот примеры:
  • EndpointNotFoundException возникает 3 раза подряд => следующее EndpointNotFoundException будет создано повторно – ПРАВИЛЬНО.
  • EndpointNotFoundException возникает 3 раза подряд, затем TimeoutException возникает 1 раз — он сбрасывает счетчик исключения EndpointNotFoundException на 0, и вам придется снова ждать, пока EndpointNotFoundException произойдет 3 раза подряд, чтобы оно было сгенерировано повторно — < strong>НЕПРАВИЛЬНО.
  • SocketException возникает 3 раза, TimeoutException возникает 3 раза, снова SocketException возникает 3 раза - только после этого SocketException выдается повторно - НЕПРАВИЛЬНО.
  • SocketException возникает 1 раз, TimeoutException возникает 2 раза, EndpointNotFoundException возникает 2 раза , то если SocketException возникнет только 3 раза, то в конечном итоге оно будет создано повторно — НЕПРАВИЛЬНО.
Другими словами, «запоминает» только попытки последнего исключения в строке. Если возникает другое исключение - оно сбрасывает счетчик попыток. Потенциально это может привести к бесконечному циклу повторных попыток исключений, скажем, EndpointNotFoundException 1 раз, TimeoutException 1 раз, SocketException 1 раз, затем снова EndpointNotFoundException 1 раз, снова TimeoutException 1 раз - и так по одному, как каждый следующий исключение, которое отличается от предыдущего - всегда сбрасывайте счетчик попыток на 0.
Я заметил, что счетчик работает некорректно, когда для каждого типа исключения используется несколько методов sqs.UseMessageRetry().< /p>
Если все исключения объявлены в пределах одного в политике sqs.UseMessageRetry() - то счётчик работает корректно для любого случайного порядка исключений.
Вероятно , Я что-то неправильно понял в том, как работает политика повторной попытки, не могли бы вы дать совет? Его легко воспроизвести, стоит ли поместить это как ошибку в GitHub?
Спасибо,
Евгений.

Подробнее здесь: https://stackoverflow.com/questions/786 ... asstransit
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»