У меня есть один потребитель, где могут возникнуть следующие исключения: 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));
});
});
});
Проблема в том, что исключения возникают в случайном порядке - например - сначала 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 раза, то в конечном итоге оно будет создано повторно — НЕПРАВИЛЬНО.
Я заметил, что счетчик работает некорректно, когда для каждого типа исключения используется несколько методов sqs.UseMessageRetry().< /p>
Если все исключения объявлены в пределах одного в политике sqs.UseMessageRetry() - то счётчик работает корректно для любого случайного порядка исключений.
Вероятно , Я что-то неправильно понял в том, как работает политика повторной попытки, не могли бы вы дать совет? Его легко воспроизвести, стоит ли поместить это как ошибку в GitHub?
Спасибо,
Евгений.
Подробнее здесь: https://stackoverflow.com/questions/786 ... asstransit