SAGA — важный шаблон в среде микросервисов, предназначенный для устранения проблем при длительных транзакциях. Продемонстрировать знания по этой теме часто просят на собеседованиях.

Поскольку архитектура микросервисов включает несколько небольших приложений, единый запрос разбивается на несколько составляющих. Поэтому есть вероятность потери некоторых из них. В таком случае становится сложно поддерживать согласованность данных.
Работая в режиме реального времени с данными, например при размещении онлайн-заказа, нужно корректно обработать этот сценарий, чтобы в случае сбоя платежа вернуть в исходное состояние корзину с выбранными товарами.
Разберемся в особенностях шаблона SAGA, а также его плюсах и минусах в микросервисной среде.
Что такое паттерн SAGA и какую проблему он решает?
SAGA (или Saga) — шаблон проектирования микросервисов, обеспечивающий согласованность (синхронизацию) данных в распределенных системах. Он позволяет обрабатывать длительные и включающие несколько этапов транзакции, в которых каждый шаг — отдельная операция, связанная с базой данных.
Основная идея состоит в том, чтобы зафиксировать в базе данных все этапы транзакции с возможностью ее отката в первоначальное состояние в случае сбоя системы.
Шаблон SAGA позволяет поддерживать согласованность данных в распределенной системе, где трудно гарантировать атомарность (неделимость) операции в транзакции, особенно в случае сбоев.
Популярный случай использования шаблона — транзакции в электронной коммерции. Например, размещение заказа на Amazon, когда оплата списывается со счета клиента, а товары резервируются в корзине.
Если один из этих шагов не выполняется, то все предыдущие «откатываются», обеспечивая согласованность данных. Так в случае сбоя платежа отменяется резервирование товаров. SAGA решает проблему согласованности в этой транзакции, включающей несколько этапов, которые не всегда бывают успешными.
Работу шаблона SAGA демонстрирует диаграмма архитектуры микросервисов:
Преимущества и недостатки SAGA в микросервисной архитектуре
Изучая этот шаблон, всегда следует учитывать его плюсы и минусы, поскольку это поможет лучше разобраться в особенностях инструмента и осознанно принимать решения по его использованию в приложениях.
Преимущества
- Упрощается реализация сложных транзакций через несколько микросервисов.
- Корректно отрабатываются сбои, обеспечивается согласованность данных.
- Повышается устойчивость и надежность системы.
- Предотвращается несогласованность данных и потеря обновлений.
- Обеспечивает понятный и четко определенный процесс компенсации транзакций.
Недостатки
- Шаблон сложно реализовать и поддерживать, а также отслеживать и отлаживать.
- Потребуются дополнительные ресурсы для хранения и управления состоянием SAGA.
- Понизится производительность из-за необходимости управлять транзакциями через несколько микросервисов.
- Увеличатся задержки в приложении из-за множественных прямых и обратных передач между микросервисами.
- Реализация SAGA в разных микросервисах не стандартизирована. Было бы здорово, если бы в будущем этот шаблон поддерживали такие фреймворки, как Spring Cloud и Quarks.
Как реализовать SAGA в микросервисной архитектуре
Шаблон SAGA можно реализовать в архитектуре микросервисов разбивкой сложной бизнес-операции на несколько небольших независимых этапов или сервисов.
Каждый шаг будет связываться с соответствующим микросервисом для завершения части транзакции. В случае сбоя на любом шаге система инициирует компенсирующую транзакцию, чтобы отменить предыдущие шаги.
Координация этих шагов может быть достигнута с помощью базы данных, очереди сообщений и службы координации, чтобы сохранить состояние транзакции и запустить компенсирующие транзакции. Таким образом, система может обеспечивать конечную согласованность и корректно обрабатывать сбои.
А есть ли фреймворк Java Microservice, способный обеспечить поддержку шаблона SAGA? Такого фреймворка, который обеспечивал бы прямую поддержку шаблона SAGA, к сожалению, нет.
Тем не менее есть возможность реализовать SAGA, используя такие библиотеки и фреймворки, как Apache Camel и Spring Integration, а также такие инструменты, как Apache Kafka, Event Sourcing и архитектура Message-Driven.

Заключение
SAGA — это один из наиболее сложных в изучении шаблонов, который играет важную роль в проектировании микросервисной архитектуры. Вопросы по нему часто задают на собеседованиях.
Поскольку управление распределенными транзакциями и согласование данных — реальная проблема, опытный разработчик должен знать, как ее решить в архитектуре микросервисов.
Читайте также:
- Совместное использование кода в микросервисах и микрофронтендах: в чем разница
- Можно ли использовать бессерверные технологии для создания микросервисов?
- Бэкенд-разработчик: какие знания нужны для трудоустройства
Читайте нас в Telegram, VK и Дзен
Перевод статьи Soma: What is SAGA Pattern in Microservice Architecture? Which Problem does it solve?