0Pricing
C# Academy · Урок

Саги и рабочие процессы

Координируйте длительные процессы.

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

Координация длительных процессов

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

Что такое сага

Сага — это потребитель с состоянием. Она связывает относящиеся друг к другу сообщения, хранит текущее состояние процесса и реагирует на события, переходя между состояниями, пока процесс не завершится.

Саги в виде конечных автоматов

MassTransit моделирует саги как конечные автоматы с помощью MassTransitStateMachine. Вы декларативно определяете состояния, события и переходы.

dotnet add package MassTransit
// state machine sagas are built in

Состояние саги

Состояние представляет собой класс, реализующий SagaStateMachineInstance. Он содержит CorrelationId и любые данные, которые необходимо сохранять между этапами.

public class OrderState : SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public string CurrentState { get; set; }
    public decimal Amount { get; set; }
}

Объявление состояний и событий

Внутри конечного автомата Вы объявляете свойства State и свойства Event, соответствующие типам сообщений.

public class OrderSaga : MassTransitStateMachine<OrderState>
{
    public State AwaitingPayment { get; private set; }
    public State Completed { get; private set; }
    public Event<OrderPlaced> OrderPlaced { get; private set; }
    public Event<PaymentReceived> PaymentReceived { get; private set; }
}

Корреляция

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

Event(() => PaymentReceived, e =>
    e.CorrelateById(m => m.Message.OrderId));

Определение переходов

Конструктор связывает поведение: начальное событие создаёт экземпляр, сохраняет данные и переводит его в следующее состояние.

Initially(
    When(OrderPlaced)
        .Then(ctx => ctx.Saga.Amount = ctx.Message.Amount)
        .TransitionTo(AwaitingPayment));

Реакция в состоянии

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

During(AwaitingPayment,
    When(PaymentReceived)
        .Publish(ctx => new OrderConfirmed(ctx.Saga.CorrelationId))
        .TransitionTo(Completed)
        .Finalize());

Сохранение состояния саги

Состояние саги должно сохраняться после перезапусков, поэтому оно хранится в репозитории: Entity Framework, MongoDB, Redis или другом хранилище. MassTransit загружает и сохраняет экземпляр при обработке каждого сообщения.

x.AddSagaStateMachine<OrderSaga, OrderState>()
    .EntityFrameworkRepository(r =>
    {
        r.ExistingDbContext<OrderDbContext>();
    });

Тайм-ауты с расписаниями

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

Компенсация

Если последующий этап завершается с ошибкой, сага может выполнить компенсирующие действия, отменяющие предыдущие действия (вернуть списанную сумму, освободить товар), сохраняя согласованность всего процесса без распределённых транзакций.

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

Проверьте саги и рабочие процессы.

Итоги

Сага координирует длительные процессы как потребитель с состоянием и корреляцией. MassTransit использует MassTransitStateMachine с состоянием SagaStateMachineInstance, объявленными членами State/Event, корреляцией по идентификатору и переходами через Initially/During. Состояние сохраняется в репозитории, тайм-ауты используют расписания, а компенсация отменяет предыдущие этапы при сбое.

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

Урок «Саги и рабочие процессы» бесплатный?

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

Чему я научусь в уроке «Саги и рабочие процессы»?

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

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

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

Сколько времени занимает урок «Саги и рабочие процессы»?

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

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

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

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

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