Найти тему
Crazy Coder

Two-Phase Commit (2PC)

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

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

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

В связи с этим, Outbox Pattern и 2PC обычно не используются вместе, поскольку они решают различные проблемы и имеют различные требования к архитектуре и производительности системы.

  1. Фаза подготовки (Prepare Phase): В этой фазе координатор протокола (обычно это один из участников или отдельный сервис) посылает запрос на подготовку всех участников к выполнению транзакции. Участники выполняют все необходимые действия, чтобы подготовиться к фиксации транзакции, и блокируют все данные, затронутые этой транзакцией. Затем каждый участник отвечает координатору, готов ли он фиксировать транзакцию или нет.
  2. Фаза подтверждения (Commit Phase): Если все участники ответили, что они готовы фиксировать транзакцию, координатор посылает каждому участнику запрос на фиксацию. Если хотя бы один участник ответил, что он не готов, координатор посылает запрос на откат. После получения запроса на фиксацию или откат, участники выполняют соответствующее действие и освобождают блокировку данных.

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