Саги и рабочие процессы
Координируйте длительные процессы.
«Саги и рабочие процессы» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы обмена сообщениями
- Создание и обработка сообщений
- Саги и рабочие процессы
- Обработка ошибок и повторные попытки