0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>При разработке бэкенда<strong>высоконагруженных сервисов</strong>часто применяют<a>распределенные транзакции</a>. О проблемах, с которыми можно столкнуться при совершении данных транзакций в микросервисах, мы уже<a>говорили</a>. Пришло время поговорить о способах их решения. Один из способов --<strong>двухфазная фиксация</strong>.</p>
1
<p>При разработке бэкенда<strong>высоконагруженных сервисов</strong>часто применяют<a>распределенные транзакции</a>. О проблемах, с которыми можно столкнуться при совершении данных транзакций в микросервисах, мы уже<a>говорили</a>. Пришло время поговорить о способах их решения. Один из способов --<strong>двухфазная фиксация</strong>.</p>
2
<p>Двухфазный метод транзакций предполагает наличие 2-х этапов: фазы подготовки и фазы фиксации. Немаловажную роль играет<strong>координатор транзакций</strong>, который, по сути, организует жизненный цикл транзакции. Рассмотрим, как это работает на практике.</p>
2
<p>Двухфазный метод транзакций предполагает наличие 2-х этапов: фазы подготовки и фазы фиксации. Немаловажную роль играет<strong>координатор транзакций</strong>, который, по сути, организует жизненный цикл транзакции. Рассмотрим, как это работает на практике.</p>
3
<p>Уже на подготовительном этапе микросервисы, которые участвуют в работе, подготавливаются к фиксации, а также уведомляют координатора о готовности завершить транзакцию. На следующем этапе фиксация либо происходит, либо координатор транзакции выдает команду микросервисам выполнить откат.</p>
3
<p>Уже на подготовительном этапе микросервисы, которые участвуют в работе, подготавливаются к фиксации, а также уведомляют координатора о готовности завершить транзакцию. На следующем этапе фиксация либо происходит, либо координатор транзакции выдает команду микросервисам выполнить откат.</p>
4
<p>В качестве примера можно привести работу интернет-магазина. Ниже -- как раз таки пример<strong>успешной</strong>2-фазной фиксации в микросервисной системе:</p>
4
<p>В качестве примера можно привести работу интернет-магазина. Ниже -- как раз таки пример<strong>успешной</strong>2-фазной фиксации в микросервисной системе:</p>
5
<p>Мы видим, что когда пользователь направляет запрос на заказ,<strong>TransactionCoordinator</strong>, обладающий полной информацией о контексте, сначала начинает глобальную транзакцию. Он отправляет команду подготовиться микросервису<strong>OrderMicroservice</strong>, что необходимо для создания заказа. Потом он отправляет команду подготовиться к<strong>InventoryMicroservice</strong>, что необходимо для резервирования товаров. Когда оба эти сервиса готовы внести изменения, происходит блокировка объектов от последующих изменений, о чем уведомляется<strong>TransactionCoordinator</strong>. И в тот момент, когда<strong>TransactionCoordinator</strong>подтвердит, что микросервисы готовы применить изменения, поступит команда микросервисам эти изменения сохранить путем<strong>запроса фиксации транзакции</strong>. В тот самый момент все объекты будут разблокированы.</p>
5
<p>Мы видим, что когда пользователь направляет запрос на заказ,<strong>TransactionCoordinator</strong>, обладающий полной информацией о контексте, сначала начинает глобальную транзакцию. Он отправляет команду подготовиться микросервису<strong>OrderMicroservice</strong>, что необходимо для создания заказа. Потом он отправляет команду подготовиться к<strong>InventoryMicroservice</strong>, что необходимо для резервирования товаров. Когда оба эти сервиса готовы внести изменения, происходит блокировка объектов от последующих изменений, о чем уведомляется<strong>TransactionCoordinator</strong>. И в тот момент, когда<strong>TransactionCoordinator</strong>подтвердит, что микросервисы готовы применить изменения, поступит команда микросервисам эти изменения сохранить путем<strong>запроса фиксации транзакции</strong>. В тот самый момент все объекты будут разблокированы.</p>
6
<p>Для полноты картины можно рассмотреть и пример<strong>неудавшейся</strong>2-фазной фиксации:</p>
6
<p>Для полноты картины можно рассмотреть и пример<strong>неудавшейся</strong>2-фазной фиксации:</p>
7
<p>В сценарии отказа, который показан на рисунке выше, все работает следующим образом: если в любую секунду отдельно взятый микросервис приготовиться не успеет, то<strong>TransactionCoordinator</strong>отменит транзакцию, запустив процесс отката. К примеру, на нашей схеме<strong>OrderMicroservice</strong>по каким-то причинам заказ создать не смог, однако<strong>InventoryMicroservice</strong>при этом откликнулся, что создать заказ он готов. В результате координатор<strong>TransactionCoordinator</strong>запросит отмену на<strong>InventoryMicroservice</strong>, ну а далее сервис откатит все выполненные изменения и разблокирует объекты БД.</p>
7
<p>В сценарии отказа, который показан на рисунке выше, все работает следующим образом: если в любую секунду отдельно взятый микросервис приготовиться не успеет, то<strong>TransactionCoordinator</strong>отменит транзакцию, запустив процесс отката. К примеру, на нашей схеме<strong>OrderMicroservice</strong>по каким-то причинам заказ создать не смог, однако<strong>InventoryMicroservice</strong>при этом откликнулся, что создать заказ он готов. В результате координатор<strong>TransactionCoordinator</strong>запросит отмену на<strong>InventoryMicroservice</strong>, ну а далее сервис откатит все выполненные изменения и разблокирует объекты БД.</p>
8
<h2>Плюсы и минусы</h2>
8
<h2>Плюсы и минусы</h2>
9
<p>Подход имеет как преимущества, так и недостатки.</p>
9
<p>Подход имеет как преимущества, так и недостатки.</p>
10
<h4>Плюсы:</h4>
10
<h4>Плюсы:</h4>
11
<ul><li>гарантируется атомарность транзакции. Транзакция завершится либо при успешной сработке обоих микросервисов, либо в том случае, если микросервисы не внесут вообще никаких изменений;</li>
11
<ul><li>гарантируется атомарность транзакции. Транзакция завершится либо при успешной сработке обоих микросервисов, либо в том случае, если микросервисы не внесут вообще никаких изменений;</li>
12
<li>изолируется чтение от записи. Изменения не видны в объектах до тех пор, пока координатор транзакций эти изменения не зафиксирует;</li>
12
<li>изолируется чтение от записи. Изменения не видны в объектах до тех пор, пока координатор транзакций эти изменения не зафиксирует;</li>
13
<li>подход является синхронным вызовом, при котором клиент уведомляется или об успехе, или о неудаче.</li>
13
<li>подход является синхронным вызовом, при котором клиент уведомляется или об успехе, или о неудаче.</li>
14
</ul><h4>Минусы:</h4>
14
</ul><h4>Минусы:</h4>
15
<ul><li>2-фазные фиксации протекают относительно медленно, если сравнивать их с операциями над одним микросервисом. Также они существенно зависят от координатора транзакций, что иногда замедляет работу системы, особенно в период повышенной загруженности;</li>
15
<ul><li>2-фазные фиксации протекают относительно медленно, если сравнивать их с операциями над одним микросервисом. Также они существенно зависят от координатора транзакций, что иногда замедляет работу системы, особенно в период повышенной загруженности;</li>
16
<li>блокируются строки базы данных. Такая блокировка может становиться узким местом, где затрудняется производительность, мало того, не исключена взаимная блокировка, когда 2 транзакции намертво застопорят друг друга.</li>
16
<li>блокируются строки базы данных. Такая блокировка может становиться узким местом, где затрудняется производительность, мало того, не исключена взаимная блокировка, когда 2 транзакции намертво застопорят друг друга.</li>
17
</ul><p><em>По материалам "<a>Handling Distributed Transactions in the Microservice world</a>".</em></p>
17
</ul><p><em>По материалам "<a>Handling Distributed Transactions in the Microservice world</a>".</em></p>
18
18