Двухфазный коммит (Two-Phase Commit, 2PC) — это протокол распределённой транзакции, который обеспечивает согласованность данных между несколькими системами или узлами. Он используется для выполнения атомарных операций в распределённых системах, таких как базы данных и брокеры сообщений.

Преимущества двухфазного коммита

  • Гарантия согласованности. Все участники либо фиксируют изменения, либо откатываются к исходному состоянию.
  • Атомарность операций. Транзакция выполняется полностью или не выполняется вообще.

Недостатки двухфазного коммита

  • Производительность.
    • Протокол увеличивает задержки из-за необходимости согласования между участниками.
    • Блокировка ресурсов (например, записей в базе данных) может привести к снижению пропускной способности системы.
  • Риск блокировок (Blocking). Если координатор выходит из строя, участники могут остаться в подвешенном состоянии, ожидая дальнейших команд.
  • Сложность реализации. Настройка двухфазного коммита в распределённых системах требует глубокого понимания протокола и особенностей инфраструктуры.
  • Проблемы масштабирования. Протокол плохо работает в системах с большим количеством участников из-за увеличения числа сообщений и времени согласования.

Протокол состоит из двух этапов:

  • Фаза подготовки (Prepare Phase):
    • Координатор транзакции отправляет запрос всем участникам (например, базам данных или брокерам сообщений) с просьбой подготовиться к выполнению операции.
    • Участники проверяют возможность выполнения операции и сообщают координатору о своём статусе:
      • “Готов” (Vote Yes), если операция может быть выполнена.
      • “Не готов” (Vote No), если операция невозможна. Если хотя бы один участник возвращает “Не готов”, координатор инициирует откат транзакции.
  • Фаза фиксации (Commit Phase):
    • Если все участники подтвердили готовность, координатор отправляет команду зафиксировать изменения (Commit).
    • Участники фиксируют изменения и подтверждают выполнение операции.
    • Если хотя бы один участник не может выполнить фиксацию, координатор отправляет команду отката (Rollback) всем участникам.

Двухфазный коммит применим, если:

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

Применение двухфазного коммита.

  • Банковские транзакции. Обеспечение согласованности при переводе средств между счетами.
  • Обновление нескольких баз данных. Когда данные в разных базах должны быть изменены синхронно.
  • Интеграция с брокерами сообщений. Обеспечение атомарности при отправке сообщений и обновлении базы данных.

Однако, в большинстве современных распределённых систем предпочитают альтернативные подходы из-за их большей гибкости и масштабируемости.

Альтернативы двухфазному коммиту

  • Идемпотентные операции. Вместо сложных транзакций системы обрабатывают повторы операций без изменений состояния.
  • Outbox-паттерн. Использование промежуточного хранилища для согласования операций.
  • Event Sourcing. Применение событийной модели, где изменения состояния записываются как события, а не как транзакции.
  • BASE вместо ACID. Принятие модели BASE, которая допускает временную рассогласованность ради повышения производительности.

Мета информация

Область:: 00 Разработка
Родитель::
Источник::
Создана:: 2025-01-13
Автор::

Дополнительные материалы

Дочерние заметки