Проблемы в микросервисах при распределенных транзакциях
При разработке бэкенда высоконагруженных сервисов нередко используются распределенные транзакции. Однако стоит понимать, что при совершении распределенных транзакций в микросервисах можно столкнуться с рядом проблем. Выделим ключевые из них
Все дело в том, что при внедрении микросервисной архитектуры используемые базы данных теряют ACID-характеристики. Так как поддерживается распространение транзакций между множеством микросервисов и, соответственно, между множеством БД, то можно столкнуться с проблемой поддержки атомарности транзакции и проблемой обработки конкурентных запросов.
Проблема поддержки атомарности транзакции
Атомарность значит, что в любой транзакции можно завершить или все шаги, или ни одного. К примеру, по каким-то причинам не удается завершить операцию "Заказать товары" в методе InventoryMicroservice. И что делать в таком случае? Каким образом тогда выполнить откат изменения в "Обработке заказа", которые применились посредством OrderMicroservice?
Проблема обработки конкурентных запросов
Теперь давайте представим, что объект от любого из микросервисов поступил на долговременное хранение в БД, причем в то же самое время другой запрос считывает тот же объект. Какие данные сервис должен вернуть – новые или старые? В нашем примере, если OrderMicroservice завершил работу, а InventoryMicroservice еще выполняет обновление, следует ли включать в количество запросов на заказы, выставленные пользователями, еще и текущий заказ?
Современные системы проектируют с учетом всевозможных отказов, а одна из главных проблем обработки распределенных транзакций, прекрасно сформулирована Патом Хелландом:
"В основном, разработчики просто не делают больших масштабируемых программных приложений, предполагающих работу с распределенными транзакциями".
Возможные решения
Проблемы, о которых мы упомянули выше, довольно критичны, особенно если рассматривать их в контексте проектирования и создания программных приложений на основе микросервисов. Для решения таких проблем используется 2 подхода:
- Двухфазная фиксация.
- Конечная согласованность и компенсация/SAGA.
В следующей части статьи рассмотрим эти подходы подробнее.
По материалам "Handling Distributed Transactions in the Microservice world".