Изменить

Поделиться через


Шаблон распределенных транзакций Saga

Azure

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

Контекст и проблема

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

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

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

В одной службе транзакции следуют принципам ACID, так как они работают в одной базе данных. Однако для обеспечения соответствия ТРЕБОВАНИЯМ ACID в нескольких службах может быть сложнее.

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

Архитектуры микрослужб обычно назначают выделенную базу данных каждой микрослужбе. Этот подход обеспечивает несколько преимуществ:

  • Каждая служба инкапсулирует собственные данные.
  • Каждая служба может использовать наиболее подходящую технологию базы данных и схему для конкретных потребностей.
  • Базы данных для каждой службы можно масштабировать независимо.
  • Сбои в одной службе изолированы от других служб.

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

Решение

Шаблон Saga управляет транзакциями, разбив их в последовательность локальных транзакций.

диаграмме, где показан обзор сага.

Каждая локальная транзакция:

  1. Выполняет свою работу атомарно в рамках одной службы.
  2. Обновляет базу данных службы.
  3. Инициирует следующую транзакцию через событие или сообщение.

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

Основные понятия в шаблоне Saga

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

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

    • необратимые или некомпенсируемые транзакции не могут быть отменены или извлечены.

    • Граница между обратимой и зафиксированной означает, что транзакция сводной таблицы может быть последней отменой или компененируемой транзакцией. Или это может быть первая повторная операция в саге.

  • повторные транзакции следовать транзакциям сводной таблицы. Повторные транзакции являются идемпотентными и помогают гарантировать, что сага может достичь окончательного состояния, даже если возникают временные сбои. Они помогают саге в конечном итоге достичь согласованного состояния.

Подходы к реализации Saga

Два типичных подхода к реализации сага являются хореографии и оркестрации. Каждый подход имеет собственный набор проблем и технологий для координации рабочего процесса.

Хореография

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

диаграмма, показывающая сагу с помощью хореографии.

Преимущества хореографии Недостатки хореографии
Хорошо подходит для простых рабочих процессов, имеющих несколько служб и не нуждающихся в логике координации. Рабочий процесс может быть запутан при добавлении новых шагов. Трудно отслеживать, на какие команды отвечает каждый участник сага.
Для координации не требуется никакой другой службы. Существует риск циклической зависимости между участниками saga, так как они должны использовать команды друг друга.
Не вводит одну точку сбоя, так как обязанности распределяются между участниками сага. Тестирование интеграции сложно, так как все службы должны выполняться для имитации транзакции.

Оркестровка

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

схема, показывающая сагу с помощью оркестрации.

Преимущества оркестрации Недостатки оркестрации
Лучше подходит для сложных рабочих процессов или при добавлении новых служб. Для другой сложности проектирования требуется реализация логики координации.
Избегает циклических зависимостей, так как оркестратор управляет потоком. Представляет точку сбоя, так как оркестратор управляет полным рабочим процессом.
Четкое разделение обязанностей упрощает логику службы.

Проблемы и рекомендации

Рассмотрим следующие моменты, как решить, как реализовать этот шаблон:

  • Shift в дизайне мышления: принятие шаблона Сага требует другого мышления. Для этого необходимо сосредоточиться на координации транзакций и согласованности данных в нескольких микрослужбах.

  • сложность отладки sagas: отладка саги может быть сложной, в частности по мере роста числа участвующих служб.

  • необратимые изменения локальной базы данных: невозможно откатить данные, так как участники saga фиксируют изменения в соответствующих базах данных.

  • Обработка временных сбоев и идемпотенса: система должна эффективно обрабатывать временные сбои и гарантировать идемпотенцию при повторе той же операции не изменяет результат. Дополнительные сведения см. в обработке сообщений Idempotent.

  • Потребность в мониторинге и отслеживании саги: мониторинг и отслеживание рабочего процесса сага являются важными задачами для поддержания оперативного надзора.

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

Потенциальные аномалии данных в сагах

Аномалии данных — это несоответствия, которые могут возникать при работе сага в нескольких службах. Так как каждая служба управляет собственными данными, называемыми данными участников, встроенная изоляция между службами отсутствует. Эта настройка может привести к несоответствиям данных или проблемам устойчивости, таким как частично примененные обновления или конфликты между службами. К типичным проблемам относятся:

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

  • Грязные считывания: Когда сага или транзакция считывает данные, измененные другой сага, но изменение не завершено.

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

Стратегии устранения аномалий данных

Чтобы уменьшить или предотвратить эти аномалии, рассмотрите следующие контрмеры:

  • семантическая блокировка: использовать блокировки уровня приложения, когда компенционная транзакция saga использует семафор, чтобы указать, что обновление выполняется.

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

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

  • перечитанные значения: Убедитесь, что данные остаются неизменными перед обновлением. Если данные изменяются, остановите текущий шаг и перезапустите сага по мере необходимости.

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

  • параллелизм на основе рисков на основе значения: динамически выбрать соответствующий механизм параллелизма на основе потенциального бизнес-риска. Например, используйте sagas для обновлений с низким риском и распределенных транзакций для обновлений высокого риска.

Когда следует использовать этот шаблон

Используйте этот шаблон, когда:

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

Этот шаблон может быть не подходит, если:

  • Транзакции тесно связаны.
  • Компенсационные транзакции происходят у предыдущих участников.
  • Существуют циклические зависимости.

Следующий шаг

При реализации этого шаблона могут быть важны следующие шаблоны:

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

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

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

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

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