#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 областях (повторная попытка, автоматический выключатель и повторная доставка?