Комбинировать повторную попытку, прерывание выполнения и задержку запланированной доставки

#masstransit

#masstransit

Вопрос:

Я изо всех сил пытаюсь правильно протестировать этот сценарий и не смог действительно сопоставить цифры. Не могли бы вы, пожалуйста, проверить, правильна ли эта конфигурация для приведенного ниже сценария?

Когда сообщение приходит к потребителю в первый раз, нужно повторить попытку для этих исключений WebException, HttpRequestException, RequestTimeoutException, TimeoutException. И после того, как эти повторные попытки исчерпаны, я хочу повторно доставить эти сообщения (только для вышеуказанных исключений), используя отложенный обмен с интервалами задержки в первый раз 2 минуты, затем 4 минуты и, наконец, 6 минут и после 3-кратной остановки повторной доставки и отправки в очередь ошибок.

Я хочу, чтобы UseMessageRetry() выполнялся только в первый раз, а не каждый раз, когда сообщение попадает к потребителю через отложенный обмен.

 cfg.UseDelayedExchangeMessageScheduler();
cfg.ReceiveEndpoint(rabbitMqConfig.QueueName, e =>
{
e.PrefetchCount = 20;
e.UseRateLimit(100, TimeSpan.FromMinutes(3));
e.UseDelayedRedelivery(p =>
{
p.Intervals(TimeSpan.FromMinutes(2), TimeSpan.FromMinutes(4),TimeSpan.FromMinutes(6));
});
e.UseCircuitBreaker(cb =>
{
cb.TrackingPeriod = TimeSpan.FromMinutes(1);
cb.TripThreshold = 15;
cb.ActiveThreshold = 10;
cb.ResetInterval = TimeSpan.FromMinutes(5);
});
e.UseMessageRetry(r =>
{
r.Incremental(2, TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(6));
r.Handle<WebException>();
r.Handle<HttpRequestException>();
r.Handle<TimeoutException>();
r.Handle<RequestTimeoutException>();
});
e.Consumer<Consumers.ProductConsumer>(provider);
});
  

Комментарии:

1. ВО-первых: это e.UseScheduledRedelivery , вы используете устаревшую функцию.

2. Фильтры вложены, и нет способа проверить UseMessageRetry условия, если GetRedeliveryCount равно > 0, поскольку условия не имеют доступа к ConsumeContext . Я добавил проблему , чтобы отслеживать это как возможное улучшение:

3. Привет, Крис, какова связь между этими событиями в конвейере? Правильно ли в этом случае мое недопонимание, что повторная доставка и автоматический выключатель происходят только для тех исключений, которые обрабатываются в MessageRetry()? А также в документации, которую я видел, UseMessageRetry() имеет комбинацию handle и ignore. почему нам нужно указывать оба? если обрабатывается одно исключение, это означает, что все остальные игнорируются, верно?

4. Они эксклюзивные, если вы работаете с конкретными, это здорово. Если вы исключите определенные из них, это тоже здорово. Если вы ничего не укажете, все будут обработаны. И повторная доставка, и автоматический выключатель имеют свою собственную область действия, они ничего не знают о UseMessageRetry.

5. Хорошо, я понимаю. Если я хочу обработать повторную попытку сообщения, автоматический выключатель и запланировать повторную доставку для WebException, HttpRequestException, TimeoutException и RequestTimeoutException, нужно ли мне указывать дескриптор<> для этих исключений во всех 3 областях (повторная попытка, автоматический выключатель и повторная доставка?