Проблемы в микросервисах при распределенных транзакциях

При разработке бэкенда высоконагруженных сервисов нередко используются распределенные транзакции. Однако стоит понимать, что при совершении распределенных транзакций в микросервисах можно столкнуться с рядом проблем. Выделим ключевые из них (начало статьи читайте здесь).

Все дело в том, что при внедрении микросервисной архитектуры используемые базы данных теряют ACID-характеристики. Так как поддерживается распространение транзакций между множеством микросервисов и, соответственно, между множеством БД, то можно столкнуться с проблемой поддержки атомарности транзакции и проблемой обработки конкурентных запросов.

Проблема поддержки атомарности транзакции

Атомарность значит, что в любой транзакции можно завершить или все шаги, или ни одного. К примеру, по каким-то причинам не удается завершить операцию "Заказать товары" в методе InventoryMicroservice. И что делать в таком случае? Каким образом тогда выполнить откат изменения в "Обработке заказа", которые применились посредством OrderMicroservice?

Проблема обработки конкурентных запросов

Теперь давайте представим, что объект от любого из микросервисов поступил на долговременное хранение в БД, причем в то же самое время другой запрос считывает тот же объект. Какие данные сервис должен вернуть – новые или старые? В нашем примере, если OrderMicroservice завершил работу, а InventoryMicroservice еще выполняет обновление, следует ли включать в количество запросов на заказы, выставленные пользователями, еще и текущий заказ?

Современные системы проектируют с учетом всевозможных отказов, а одна из главных проблем обработки распределенных транзакций, прекрасно сформулирована Патом Хелландом:

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

Возможные решения

Проблемы, о которых мы упомянули выше, довольно критичны, особенно если рассматривать их в контексте проектирования и создания программных приложений на основе микросервисов. Для решения таких проблем используется 2 подхода:

  1. Двухфазная фиксация.
  2. Конечная согласованность и компенсация/SAGA.

В следующей части статьи рассмотрим эти подходы подробнее.

По материалам "Handling Distributed Transactions in the Microservice world".