Механизм компенсации распределенных транзакций: глубокое понимание паттерна Saga
Механизм компенсации распределенных транзакций: глубокое понимание паттерна Saga

Всем привет! Мы снова сосредоточимся на проблеме распределенных транзакций. В предыдущей статье мы подробно рассмотрели схему двухфазной фиксации (2PC). Однако двухфазная фиксация также имеет свои ограничения, такие как необходимость в очень надежном координаторе и возможность блокировки системы в случае сбоя координатора. Итак, есть ли другие решения этой проблемы? Ответ — да, это компенсационные транзакции, также известные как режим Саги. Сегодня давайте вместе рассмотрим этот план.

1. Что такое компенсационная транзакция (режим Saga)?

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

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

2. Как работает режим Саги?

  1. нормальный процесс:существоватьSagaрежим,Каждое дело выполняется последовательно. Если все дела увенчаются успехом,Тогда сага выполняется успешно.
  2. Обработка исключений:еслисуществоватьосуществлятьSagaв процессе,Определенное дело провалилось,Затем запускается процесс компенсации. В процессе компенсации будут выполнены соответствующие компенсационные дела для всех успешных дел.,Выполняется в порядке, обратном их исполнению,Откатите состояние данных до состояния перед выполнением саги.

Например, у нас есть сага, содержащая три транзакции T1, T2 и T3 и соответствующие компенсационные транзакции C1, C2 и C3. Если T1 и T2 успешны, а T3 терпят неудачу, мы выполняем C2 и C1, чтобы отменить эффекты T1 и T2.

3. Преимущества и недостатки режима Саги

преимущество:SagaУзор хорошо решен Распределенные транзакциивопрос,Особенно в микросервисной архитектуре,Каждая служба может самостоятельно вести свои дела и компенсационные дела.,Нет необходимости в централизованном координаторе. Это устраняет единственную проблему,Улучшено удобство использования системы.

недостаток:ноSagaШаблоны также имеют свои ограничения。первый,Для каждого дела необходимо определить соответствующие компенсационные дела.,Это увеличивает сложность разработки. Во-вторых,Поскольку режим Saga обрабатывает неудачную транзакцию путем отката выполненной транзакции.,Поэтому в некоторых случаях,Производительность в реальном времени не может быть гарантирована.,Потому что операция отката может занять много времени.

4. Происхождение саги

Слово «Сага» изначально было формой повествования в Северной Европе. Обычно оно используется для описания приключений героев или истории королевской семьи. Хотя эти события или истории являются полными. по отдельности они все являются неотъемлемой частью повествования.

В контексте баз данных и распределенных систем термин «Сага» был впервые введен Гектором Гарсиа-Молиной и Кеннетом Салемом в их статье 1987 года «Концепция саги в системах длинных транзакций». По их определению, сага — это длинная транзакция, состоящая из серии более коротких субтранзакций (которые можно понимать как шаги или операции). Эти субтранзакции могут быть независимо зафиксированы в базе данных. Если сага не может завершиться успешно (например, из-за сбоя одной из субтранзакций), уже выполненные субтранзакции можно откатить с помощью серии компенсирующих транзакций (компенсирующих транзакций).

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

5. Резюме

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

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

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода