0Pricing
C# Academy · Урок

Обработка ошибок и повторные попытки

Обрабатывайте сбои с помощью повторных попыток и очередей недоставленных сообщений.

«Обработка ошибок и повторные попытки» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Сбои — это нормально

Потребители могут завершаться с ошибкой: из-за временной ошибки базы данных, тайм-аута последующей системы или ошибки в данных. MassTransit предоставляет многоуровневые средства (повторные попытки, повторную доставку и очереди ошибок), чтобы обрабатывать сбои корректно, не теряя сообщения.

Немедленная повторная попытка

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

cfg.ReceiveEndpoint("orders", e =>
{
    e.UseMessageRetry(r => r.Immediate(3));
    e.ConfigureConsumer<OrderConsumer>(context);
});

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

Интервалы между повторными попытками помогают, когда восстановление занимает больше времени. Используйте интервалы или экспоненциальную задержку, как в Polly.

e.UseMessageRetry(r =>
    r.Exponential(5,
        minInterval: TimeSpan.FromSeconds(1),
        maxInterval: TimeSpan.FromMinutes(1),
        intervalDelta: TimeSpan.FromSeconds(2)));

Фильтрация ошибок для повторных попыток

Повторяйте попытку только для временных исключений; не повторяйте её для постоянных ошибок, таких как ошибки проверки данных. Используйте Handle и Ignore, чтобы ограничить область повторных попыток.

e.UseMessageRetry(r =>
{
    r.Handle<TimeoutException>();
    r.Ignore<ValidationException>();
    r.Immediate(3);
});

Повторная попытка и повторная доставка

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

e.UseDelayedRedelivery(r =>
    r.Intervals(TimeSpan.FromMinutes(5),
                TimeSpan.FromMinutes(15),
                TimeSpan.FromMinutes(30)));

Объединение обоих уровней

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

e.UseDelayedRedelivery(r => r.Intervals(
    TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));

Очередь ошибок

Когда все повторные попытки и повторные доставки исчерпаны, MassTransit перемещает сообщение в очередь ошибок с именем <queue>_error. Сообщение сохраняется вместе с подробностями исключения для расследования и никогда не удаляется незаметно.

Сбои

При сбое MassTransit также публикует событие Fault<T>. Другие службы могут обрабатывать сообщения о сбоях, чтобы отправлять оповещения, вести журнал или запускать компенсацию.

public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
    public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
    {
        // inspect context.Message.Exceptions
        return Task.CompletedTask;
    }
}

Важность идемпотентности

Поскольку повторные попытки и повторная доставка могут обработать сообщение более одного раза, потребители должны быть идемпотентными: повторная обработка одного и того же сообщения не должна приводить к двойному списанию средств или дублированию работы. Используйте уникальные идентификаторы и проверки на дублирование.

Повторная обработка из очереди ошибок

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

Очереди недоставленных и пропущенных сообщений

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

Быстрая проверка

Проверьте обработку ошибок и повторные попытки.

Итоги

MassTransit использует многоуровневую обработку сбоев: повторные попытки (немедленные или экспоненциальные, ограниченные с помощью Handle/Ignore) для кратковременных сбоев, повторную доставку для более длительных отказов и очередь ошибок для сообщений, обработка которых завершилась неудачей, а также события Fault<T> для оповещений. Поскольку сообщения могут обрабатываться более одного раза, делайте потребителей идемпотентными и повторно обрабатывайте сообщения из очереди ошибок после исправления ошибок.

Часто задаваемые вопросы

Урок «Обработка ошибок и повторные попытки» бесплатный?

Да — полный текст урока «Обработка ошибок и повторные попытки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработка ошибок и повторные попытки»?

Обрабатывайте сбои с помощью повторных попыток и очередей недоставленных сообщений. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Обработка ошибок и повторные попытки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы обмена сообщениями
  2. Создание и обработка сообщений
  3. Саги и рабочие процессы
  4. Обработка ошибок и повторные попытки
← Назад к C# Academy