HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>При разработке бэкенда<strong>высоконагруженных сервисов</strong>нередко используются<a>распределенные транзакции</a>. Однако стоит понимать, что при совершении распределенных транзакций в микросервисах можно столкнуться с рядом проблем. Выделим ключевые из них (начало статьи читайте<a>здесь</a>).</p>
1 <p>При разработке бэкенда<strong>высоконагруженных сервисов</strong>нередко используются<a>распределенные транзакции</a>. Однако стоит понимать, что при совершении распределенных транзакций в микросервисах можно столкнуться с рядом проблем. Выделим ключевые из них (начало статьи читайте<a>здесь</a>).</p>
2 <p>Все дело в том, что при внедрении микросервисной архитектуры используемые базы данных теряют ACID-характеристики. Так как поддерживается распространение транзакций между множеством микросервисов и, соответственно, между множеством БД, то можно столкнуться с<strong>проблемой поддержки атомарности транзакции</strong>и<strong>проблемой обработки конкурентных запросов</strong>.</p>
2 <p>Все дело в том, что при внедрении микросервисной архитектуры используемые базы данных теряют ACID-характеристики. Так как поддерживается распространение транзакций между множеством микросервисов и, соответственно, между множеством БД, то можно столкнуться с<strong>проблемой поддержки атомарности транзакции</strong>и<strong>проблемой обработки конкурентных запросов</strong>.</p>
3 <h3>Проблема поддержки атомарности транзакции</h3>
3 <h3>Проблема поддержки атомарности транзакции</h3>
4 <p><strong>Атомарность</strong>значит, что в любой транзакции можно завершить или все шаги, или ни одного. К примеру, по каким-то причинам не удается завершить операцию "Заказать товары" в методе<strong>InventoryMicroservice</strong>. И что делать в таком случае? Каким образом тогда выполнить откат изменения в "Обработке заказа", которые применились посредством<strong>OrderMicroservice</strong>?</p>
4 <p><strong>Атомарность</strong>значит, что в любой транзакции можно завершить или все шаги, или ни одного. К примеру, по каким-то причинам не удается завершить операцию "Заказать товары" в методе<strong>InventoryMicroservice</strong>. И что делать в таком случае? Каким образом тогда выполнить откат изменения в "Обработке заказа", которые применились посредством<strong>OrderMicroservice</strong>?</p>
5 <h2>Проблема обработки конкурентных запросов</h2>
5 <h2>Проблема обработки конкурентных запросов</h2>
6 <p>Теперь давайте представим, что объект от любого из микросервисов поступил на долговременное хранение в БД, причем<strong>в то же самое время другой запрос считывает тот же объект</strong>. Какие данные сервис должен вернуть - новые или старые? В нашем примере, если<strong>OrderMicroservice</strong>завершил работу, а<strong>InventoryMicroservice</strong>еще выполняет обновление, следует ли включать в количество запросов на заказы, выставленные пользователями, еще и текущий заказ?</p>
6 <p>Теперь давайте представим, что объект от любого из микросервисов поступил на долговременное хранение в БД, причем<strong>в то же самое время другой запрос считывает тот же объект</strong>. Какие данные сервис должен вернуть - новые или старые? В нашем примере, если<strong>OrderMicroservice</strong>завершил работу, а<strong>InventoryMicroservice</strong>еще выполняет обновление, следует ли включать в количество запросов на заказы, выставленные пользователями, еще и текущий заказ?</p>
7 <p>Современные системы проектируют с учетом всевозможных отказов, а одна из главных проблем обработки распределенных транзакций, прекрасно сформулирована Патом Хелландом:</p>
7 <p>Современные системы проектируют с учетом всевозможных отказов, а одна из главных проблем обработки распределенных транзакций, прекрасно сформулирована Патом Хелландом:</p>
8 <p><em>"В основном, разработчики просто не делают больших масштабируемых программных приложений, предполагающих работу с распределенными транзакциями".</em></p>
8 <p><em>"В основном, разработчики просто не делают больших масштабируемых программных приложений, предполагающих работу с распределенными транзакциями".</em></p>
9 <h2>Возможные решения</h2>
9 <h2>Возможные решения</h2>
10 <p>Проблемы, о которых мы упомянули выше, довольно критичны, особенно если рассматривать их в контексте проектирования и создания программных приложений на основе микросервисов. Для решения таких проблем используется 2 подхода:</p>
10 <p>Проблемы, о которых мы упомянули выше, довольно критичны, особенно если рассматривать их в контексте проектирования и создания программных приложений на основе микросервисов. Для решения таких проблем используется 2 подхода:</p>
11 <ol><li><strong>Двухфазная фиксация</strong>.</li>
11 <ol><li><strong>Двухфазная фиксация</strong>.</li>
12 <li><strong>Конечная согласованность и компенсация/SAGA</strong>.</li>
12 <li><strong>Конечная согласованность и компенсация/SAGA</strong>.</li>
13 </ol><p>В следующей части статьи рассмотрим эти подходы подробнее.</p>
13 </ol><p>В следующей части статьи рассмотрим эти подходы подробнее.</p>
14 <p><em>По материалам "<a>Handling Distributed Transactions in the Microservice world</a>".</em></p>
14 <p><em>По материалам "<a>Handling Distributed Transactions in the Microservice world</a>".</em></p>
15  
15