Найти тему
Nuances of programming

Что такое шаблон SAGA и какую проблему он решает в микросервисной архитектуре

Оглавление

Источник: Nuances of Programming

Курс SkillFactory Java-разработчик. Освойте backend-разработку и программирование на Java, Spring и основы DevOps. Соберите портфолио проектов и начните откликаться на вакансии уже после 7 месяцев обучения.

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

-2

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

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

Разберемся в особенностях шаблона SAGA, а также его плюсах и минусах в микросервисной среде.

Что такое паттерн SAGA и какую проблему он решает?

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

Основная идея состоит в том, чтобы зафиксировать в базе данных все этапы транзакции с возможностью ее отката в первоначальное состояние в случае сбоя системы.

Шаблон SAGA позволяет поддерживать согласованность данных в распределенной системе, где трудно гарантировать атомарность (неделимость) операции в транзакции, особенно в случае сбоев.

Популярный случай использования шаблона  —  транзакции в электронной коммерции. Например, размещение заказа на Amazon, когда оплата списывается со счета клиента, а товары резервируются в корзине.

Если один из этих шагов не выполняется, то все предыдущие «откатываются», обеспечивая согласованность данных. Так в случае сбоя платежа отменяется резервирование товаров. SAGA решает проблему согласованности в этой транзакции, включающей несколько этапов, которые не всегда бывают успешными.

Работу шаблона SAGA демонстрирует диаграмма архитектуры микросервисов:

-3

Преимущества и недостатки SAGA в микросервисной архитектуре

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

Преимущества

  1. Упрощается реализация сложных транзакций через несколько микросервисов.
  2. Корректно отрабатываются сбои, обеспечивается согласованность данных.
  3. Повышается устойчивость и надежность системы.
  4. Предотвращается несогласованность данных и потеря обновлений.
  5. Обеспечивает понятный и четко определенный процесс компенсации транзакций.

Недостатки

  1. Шаблон сложно реализовать и поддерживать, а также отслеживать и отлаживать.
  2. Потребуются дополнительные ресурсы для хранения и управления состоянием SAGA.
  3. Понизится производительность из-за необходимости управлять транзакциями через несколько микросервисов.
  4. Увеличатся задержки в приложении из-за множественных прямых и обратных передач между микросервисами.
  5. Реализация SAGA в разных микросервисах не стандартизирована. Было бы здорово, если бы в будущем этот шаблон поддерживали такие фреймворки, как Spring Cloud и Quarks.

Как реализовать SAGA в микросервисной архитектуре

Шаблон SAGA можно реализовать в архитектуре микросервисов разбивкой сложной бизнес-операции на несколько небольших независимых этапов или сервисов.

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

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

А есть ли фреймворк Java Microservice, способный обеспечить поддержку шаблона SAGA? Такого фреймворка, который обеспечивал бы прямую поддержку шаблона SAGA, к сожалению, нет.

Тем не менее есть возможность реализовать SAGA, используя такие библиотеки и фреймворки, как Apache Camel и Spring Integration, а также такие инструменты, как Apache Kafka, Event Sourcing и архитектура Message-Driven.

-4

Заключение

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

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

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Soma: What is SAGA Pattern in Microservice Architecture? Which Problem does it solve?