Українська

Поглиблене дослідження розподілених транзакцій та протоколу двофазної фіксації (2PC). Дізнайтеся про його архітектуру, переваги, недоліки та практичне застосування в глобальних системах.

Розподілені транзакції: глибоке занурення у двофазну фіксацію (2PC)

У сучасному взаємопов'язаному світі додаткам часто потрібно взаємодіяти з даними, що зберігаються в декількох незалежних системах. Це породжує концепцію розподілених транзакцій, де одна логічна операція вимагає внесення змін до декількох баз даних або сервісів. Забезпечення консистентності даних у таких сценаріях є надзвичайно важливим, і одним із найвідоміших протоколів для досягнення цього є двофазна фіксація (2PC).

Що таке розподілена транзакція?

Розподілена транзакція – це серія операцій, що виконуються в декількох географічно розподілених системах, і розглядаються як єдина атомарна одиниця. Це означає, що або всі операції в транзакції повинні успішно завершитися (фіксація), або жодна (відкат). Цей принцип "все або нічого" забезпечує цілісність даних у всій розподіленій системі.

Розглянемо сценарій, коли клієнт у Токіо бронює авіаквиток з Токіо до Лондона в одній авіаційній системі та одночасно резервує номер у готелі в Лондоні в іншій системі бронювання готелів. Ці дві операції (бронювання авіаквитка та резервування готелю) в ідеалі слід розглядати як єдину транзакцію. Якщо бронювання авіаквитка проходить успішно, але резервування готелю не вдається, система в ідеалі повинна скасувати бронювання авіаквитка, щоб клієнт не опинився в Лондоні без житла. Ця скоординована поведінка є сутністю розподіленої транзакції.

Представляємо протокол двофазної фіксації (2PC)

Протокол двофазної фіксації (2PC) – це розподілений алгоритм, який забезпечує атомарність у декількох менеджерах ресурсів (наприклад, базах даних). Він включає центрального координатора та кількох учасників, кожен з яких відповідає за управління певним ресурсом. Протокол працює у дві окремі фази:

Фаза 1: Фаза підготовки

На цьому етапі координатор ініціює транзакцію та просить кожного учасника підготуватися до фіксації або відкату транзакції. Кроки, які виконуються, наступні:

  1. Координатор надсилає запит на підготовку: Координатор надсилає повідомлення "підготуватися" всім учасникам. Це повідомлення сигналізує про те, що координатор готовий зафіксувати транзакцію, і просить кожного учасника підготуватися до цього.
  2. Учасники готуються та відповідають: Кожен учасник отримує запит на підготовку та виконує наступні дії:
    • Він робить необхідні кроки, щоб забезпечити можливість фіксації або відкату транзакції (наприклад, запис журналів redo/undo).
    • Він надсилає "голос" назад координатору, вказуючи або "готовий до фіксації" ("так" голос), або "не може зафіксувати" ("ні" голос). "Ні" голос може бути пов'язаний з обмеженнями ресурсів, збоями перевірки даних або іншими помилками.

Для учасників дуже важливо гарантувати, що вони можуть або зафіксувати, або відкотити зміни, щойно вони проголосували "так". Зазвичай це передбачає збереження змін у стабільне сховище (наприклад, на диск).

Фаза 2: Фаза фіксації або відкату

Ця фаза ініціюється координатором на основі голосів, отриманих від учасників на етапі підготовки. Можливі два результати:

Результат 1: Фіксація

Якщо координатор отримує голоси "так" від усіх учасників, він переходить до фіксації транзакції.

  1. Координатор надсилає запит на фіксацію: Координатор надсилає повідомлення "зафіксувати" всім учасникам.
  2. Учасники фіксують: Кожен учасник отримує запит на фіксацію та назавжди застосовує зміни, пов'язані з транзакцією, до свого ресурсу.
  3. Учасники підтверджують: Кожен учасник надсилає повідомлення підтвердження назад координатору, щоб підтвердити, що операція фіксації пройшла успішно.
  4. Координатор завершує: Після отримання підтверджень від усіх учасників координатор позначає транзакцію як завершену.

Результат 2: Відкат

Якщо координатор отримує хоча б один голос "ні" від будь-якого учасника або якщо час очікування відповіді від учасника закінчується, він вирішує відкотити транзакцію.

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

Наочний приклад: Обробка замовлень електронної комерції

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

  1. Фаза підготовки:
    • Система електронної комерції (координатор) надсилає запит на підготовку до бази даних інвентаризації та платіжного шлюзу.
    • База даних інвентаризації перевіряє, чи є запитані товари в наявності, і резервує їх. Потім він голосує "так", якщо успішно, або "ні", якщо товарів немає в наявності.
    • Платіжний шлюз попередньо авторизує платіж. Потім він голосує "так", якщо успішно, або "ні", якщо авторизація не вдається (наприклад, недостатньо коштів).
  2. Фаза фіксації/відкату:
    • Сценарій фіксації: Якщо база даних інвентаризації та платіжний шлюз голосують "так", координатор надсилає запит на фіксацію обом. База даних інвентаризації остаточно зменшує кількість запасів, а платіжний шлюз фіксує платіж.
    • Сценарій відкату: Якщо база даних інвентаризації або платіжний шлюз голосує "ні", координатор надсилає запит на відкат обом. База даних інвентаризації звільняє зарезервовані товари, а платіжний шлюз скасовує попередню авторизацію.

Переваги двофазної фіксації

Недоліки двофазної фіксації

Альтернативи двофазній фіксації

Через обмеження 2PC з'явилося кілька альтернативних підходів до управління розподіленими транзакціями. До них відносяться:

Практичне застосування двофазної фіксації

Незважаючи на свої обмеження, 2PC все ще використовується в різних сценаріях, де сувора консистентність є критичною вимогою. Деякі приклади включають:

Реалізація двофазної фіксації

Реалізація 2PC вимагає ретельного врахування різних факторів, включаючи:

Глобальні міркування для розподілених транзакцій

Під час проектування та реалізації розподілених транзакцій у глобальному середовищі необхідно враховувати кілька додаткових факторів:

Висновок

Розподілені транзакції та протокол двофазної фіксації (2PC) є важливими концепціями для побудови надійних і консистентних розподілених систем. Хоча 2PC надає просте та широко використовуване рішення для забезпечення атомарності, його обмеження, особливо щодо блокування та єдиної точки відмови, вимагають ретельного розгляду альтернативних підходів, таких як Sagas та можлива консистентність. Розуміння компромісів між строгою консистентністю, доступністю та продуктивністю має вирішальне значення для вибору правильного підходу для конкретних потреб вашого додатку. Крім того, при роботі в глобальному середовищі необхідно враховувати додаткові міркування щодо затримки мережі, часових поясів, локалізації даних і відповідності нормативним вимогам, щоб забезпечити успіх розподілених транзакцій.