Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Kafka: saga, compensation

Как реализовать компенсационные действия в распределённых транзакциях?

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

Короткий ответ

В распределённых системах обычно нельзя использовать одну ACID-транзакцию на все сервисы. Вместо этого применяют Saga-подход, где каждый шаг имеет компенсирующее действие. Если один шаг падает, запускаются компенсации для уже выполненных шагов. Компенсации — это не “rollback”, а бизнес-обратные операции. Часто они реализуются через события и оркестрацию.

Длинный ответ

Определение

Компенсационное действие — это операция, которая логически отменяет эффект ранее успешно выполненного шага в распределённом процессе.

Почему нельзя просто сделать rollback

  • Нет общей БД и общего transaction manager.

  • Шаги выполняются в разных сервисах и в разное время.

  • Данные могли уже использоваться другими процессами.

Подход Saga

Saga — это последовательность локальных транзакций, где:

  • каждый шаг фиксирует изменения локально;

  • для каждого шага определено compensation action.

Основные варианты Saga

  1. Оркестрация

    • Центральный координатор знает порядок шагов.

    • Он же решает, какие компенсации запускать.

    • Проще контролировать, сложнее масштабировать.

  2. Хореография

    • Сервисы реагируют на события друг друга.

    • Нет центрального управляющего сервиса.

    • Меньше связанность, сложнее отлаживать поток.

Упрощённый пример логики

# Псевдокод оркестратора
try:
    reserve_stock()
    withdraw_money()
    create_order()
except Exception:
    compensate_create_order()
    compensate_withdraw_money()
    compensate_reserve_stock()

Важные нюансы

  • Компенсации должны быть идемпотентными.

  • Компенсация может не вернуть систему в исходное состояние на 100%.

  • Нужны ретраи, дед-леттеры и ручные процедуры для “зависших” саг.

Вывод

Компенсации — это бизнес-rollback, а не технический. Они являются основой Saga-подхода и позволяют жить без распределённых транзакций.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    8

Навыки

  • Kafka

    Kafka

Ключевые слова

#saga

#compensation

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.