Saga (шаблон проєктування)

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

Проблема[ред. | ред. код]

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

Вирішення[ред. | ред. код]

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

Опис[ред. | ред. код]

Хореографія[ред. | ред. код]

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

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

Оркестрація[ред. | ред. код]

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

Недоліки[ред. | ред. код]

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


Реалізація[ред. | ред. код]

C#[ред. | ред. код]


Див. також[ред. | ред. код]