Saga — патерн проєктування, який дозволяє координувати транзакції здійснені до різних баз даних у вигляді однієї операції.

Проблема

ред.

Необхідно виконати декілька транзакцій до різних баз даних у вигляді єдиної операції.

Вирішення

ред.

Виконувати транзакції одна за одною, та в разі невдачі хоч однієї скасувати усі попередні.

Опис

ред.

Хореографія

ред.

Кожний вузол здійснює транзакцію та публікує повідомлення, яке запускає транзакції в інших вузлах.

 
Діаграма, що демонструє взаємодію компонентів при реалізації хореографії у Saga
  1. Вузол № 1 здійснює транзакцію та публікує повідомлення про її успішність.
  2. Вузол № 2 отримує повідомлення про завершення операції у вузлі № 1 та здійснює транзакцію. Після чого публікує повідомлення про її успішність.
    1. Якщо під час транзакції відбулась помилка, вузол № 1 скасовує транзакцію.
  3. Вузол № 3 отримує повідомлення про успішне завершення операції у вузлі № 2 та здійснює транзакцію. Після чого публікує повідомлення про її успішність.
    1. Якщо під час транзакції відбулась помилка, вузол № 2 скасовує транзакцію.
    2. Вузол № 1 отримує повідомлення про скасування транзакції від вузла № 2 (або про помилку виконання у вузлі № 3) і також скасовує транзакцію.

Оркестрація

ред.
 
Діаграма, що демонструє взаємодію компонентів при реалізації оркестрації у Saga
  1. Координатор по черзі надсилає запит на здійснення транзакції кожному вузлу.
  2. Якщо хоч один вузол відповідає про помилку здійснення транзакції, координатор у зворотному порядку надсилає запити про скасування транзакції усім вузлам.

Недоліки

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


Реалізація

ред.


Див. також

ред.