← Назад к вопросам

Что такое паттерн SAGA?

1.0 Junior🔥 232 комментариев
#Архитектура и микросервисы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое паттерн SAGA?

SAGA — это архитектурный паттерн для управления распределёнными транзакциями в микросервисных системах. В отличие от традиционных ACID-транзакций в монолитных приложениях, где используется двухфазный коммит (2PC), SAGA предлагает подход, основанный на последовательности локальных транзакций и компенсирующих действий (компенсаций) для отката изменений в случае сбоя. Этот паттерн был впервые описан в 1987 году Гектором Гарсиа-Молиной, но стал особенно актуален с ростом популярности микросервисов.

Ключевая проблема, которую решает SAGA — обеспечение согласованности данных между несколькими сервисами без использования глобальных блокировок. Вместо атомарной фиксации всех операций, SAGA разбивает бизнес-процесс на шаги, каждый из которых выполняется в рамках локальной транзакции отдельного сервиса. Если какой-то шаг завершается неудачно, система выполняет компенсирующие транзакции для отмены уже выполненных шагов.

Основные принципы работы SAGA

1. Структура SAGA

Каждая SAGA состоит из последовательности транзакций T1, T2, ..., Tn и соответствующих им компенсирующих транзакций C1, C2, ..., Cn. Компенсирующая транзакция Ci отменяет изменения, сделанные транзакцией Ti, но не в смысле полного восстановления состояния (как ROLLBACK в БД), а путём выполнения бизнес-логики, обратной к Ti.

Пример процесса "Оформление заказа":

  • T1: Создание заказа (сервис заказов)
  • T2: Резервирование товара (сервис склада)
  • T3: Списание средств (сервис платежей)

Если T3 завершается ошибкой, выполняется:

  • C3: (пропускается, так как T3 не выполнен)
  • C2: Отмена резервирования товара
  • C1: Пометить заказ как отменённый

2. Два подхода к координации

SAGA может быть реализована двумя способами:

Хореография (Choreography)

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

// Пример события в хореографии на C#
public class OrderCreatedEvent
{
    public Guid OrderId { get; set; }
    public decimal Amount { get; set; }
}

// Сервис платежей подписывается на событие
public class PaymentService
{
    public void Handle(OrderCreatedEvent @event)
    {
        try
        {
            ProcessPayment(@event.OrderId, @event.Amount);
            Publish(new PaymentCompletedEvent { OrderId = @event.OrderId });
        }
        catch
        {
            Publish(new PaymentFailedEvent { OrderId = @event.OrderId });
        }
    }
}
Оркестрация (Orchestration)

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

// Пример оркестратора на C#
public class OrderOrchestrator
{
    public async Task ProcessOrder(OrderRequest request)
    {
        try
        {
            await orderService.CreateOrder(request);
            await inventoryService.ReserveItems(request);
            await paymentService.ChargeCustomer(request);
            await orderService.ConfirmOrder(request);
        }
        catch (Exception ex)
        {
            // Компенсация
            await paymentService.RefundIfCharged(request);
            await inventoryService.ReleaseItems(request);
            await orderService.CancelOrder(request);
        }
    }
}

Преимущества и недостатки паттерна SAGA

Преимущества:

  • Отсутствие глобальных блокировок: Повышает производительность и масштабируемость.
  • Гибкость: Позволяет моделировать сложные бизнес-процессы.
  • Отказоустойчивость: Компенсирующие транзакции помогают поддерживать согласованность данных.
  • Поддержка длительных транзакций: SAGA может выполняться минуты, часы или даже дни.

Недостатки:

  • Сложность отладки: Из-за распределённой природы процесс трудно отслеживать.
  • Риск неотменяемых операций: Некоторые действия (например, отправка email) невозможно компенсировать.
  • Потенциальная несогласованность: В системе может возникнуть временная несогласованность данных.
  • Дополнительная кодовая база: Необходимо писать компенсирующую логику.

Практическое применение в C# Backend

В экосистеме .NET для реализации SAGA часто используются:

  • MassTransit с Automatonymous для State Machine Sagas
  • NServiceBus с функционалом Sagas
  • Dapr для построения event-driven приложений
  • Azure Durable Functions для оркестрации длительных процессов

Пример с MassTransit:

public class OrderSaga : MassTransitStateMachine<OrderSagaState>
{
    public State Created { get; private set; }
    public State Processing { get; private set; }
    public State Completed { get; private set; }
    public State Failed { get; private set; }
    
    public Event<OrderCreated> OrderCreatedEvent { get; private set; }
    public Event<PaymentCompleted> PaymentCompletedEvent { get; private set; }
    public Event<PaymentFailed> PaymentFailedEvent { get; private set; }
    
    public OrderSaga()
    {
        Initially(
            When(OrderCreatedEvent)
                .Then(context => { /* Обработка */ })
                .TransitionTo(Created)
                .Publish(context => new ReserveInventoryCommand()));
        
        During(Created,
            When(PaymentCompletedEvent)
                .TransitionTo(Completed),
            When(PaymentFailedEvent)
                .TransitionTo(Failed)
                .Publish(context => new CancelOrderCommand()));
    }
}

Рекомендации по использованию

  1. Тщательно проектируйте компенсирующие транзакции: Они должны быть идемпотентными и учитывать все побочные эффекты.
  2. Используйте паттерн "Повтор с экспоненциальной задержкой" для обработки временных сбоев.
  3. Внедряйте мониторинг и трассировку: Инструменты вроде OpenTelemetry или Application Insights помогут отслеживать выполнение SAGA.
  4. Выбирайте подход к координации осознанно: Хореография проще для небольших процессов, оркестрация — для сложных сценариев.
  5. Документируйте сценарии отказов: Чётко определите, как система ведёт себя при различных ошибках.

Паттерн SAGA — важный инструмент в арсенале backend-разработчика, работающего с микросервисами. Он позволяет строить отказоустойчивые системы, сохраняя семантику транзакций в распределённой среде, хотя и ценой повышенной сложности реализации и сопровождения.

Что такое паттерн SAGA? | PrepBro