Български

Задълбочено изследване на разпределените трансакции и двуфазния протокол за потвърждение (2PC). Научете за неговата архитектура, предимства, недостатъци и практически приложения в глобални системи.

Разпределени трансакции: Задълбочен поглед върху двуфазния протокол за потвърждение (2PC)

В днешния все по-взаимосвързан свят приложенията често трябва да взаимодействат с данни, съхранявани в множество независими системи. Това води до концепцията за разпределени трансакции, при които една логическа операция изисква промени в няколко бази данни или услуги. Гарантирането на консистентност на данните в такива сценарии е от първостепенно значение, а един от най-известните протоколи за постигането на това е двуфазният протокол за потвърждение (2PC).

Какво е разпределена трансакция?

Разпределената трансакция е поредица от операции, извършвани върху множество, географски разпръснати системи, третирани като една атомна единица. Това означава, че или всички операции в рамките на трансакцията трябва да успеят (commit), или нито една не трябва (rollback). Този принцип "всичко или нищо" гарантира целостта на данните в цялата разпределена система.

Представете си сценарий, при който клиент в Токио резервира полет от Токио до Лондон в една авиокомпания и едновременно с това резервира хотелска стая в Лондон в друга система за хотелски резервации. Тези две операции (резервация на полет и резервация на хотел) в идеалния случай трябва да се третират като една трансакция. Ако резервацията на полета успее, но резервацията на хотела се провали, системата в идеалния случай трябва да отмени резервацията на полета, за да не остави клиента в Лондон без настаняване. Това координирано поведение е същността на разпределената трансакция.

Представяне на двуфазния протокол за потвърждение (2PC)

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

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

В тази фаза координаторът инициира трансакцията и моли всеки участник да се подготви за потвърждаване или отмяна на трансакцията. Стъпките са следните:

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

От решаващо значение е участниците да гарантират, че могат или да потвърдят, или да отменят промените, след като са гласували с "да". Това обикновено включва запазване на промените на стабилен носител (напр. диск).

Фаза 2: Фаза на потвърждение или отмяна

Тази фаза се инициира от координатора въз основа на гласовете, получени от участниците във фазата на подготовка. Има два възможни изхода:

Резултат 1: Потвърждение (Commit)

Ако координаторът получи гласове "да" от всички участници, той продължава с потвърждаването на трансакцията.

  1. Координаторът изпраща заявка за потвърждение: Координаторът изпраща съобщение "потвърди" до всички участници.
  2. Участниците потвърждават: Всеки участник получава заявката за потвърждение и прилага за постоянно промените, свързани с трансакцията, към своя ресурс.
  3. Участниците изпращат потвърждение: Всеки участник изпраща съобщение за потвърждение обратно до координатора, за да потвърди, че операцията за потвърждение е била успешна.
  4. Координаторът завършва: След получаване на потвърждения от всички участници, координаторът маркира трансакцията като завършена.

Резултат 2: Отмяна (Rollback)

Ако координаторът получи дори един-единствен глас "не" от някой участник, или ако изтече времето за изчакване на отговор от участник, той решава да отмени трансакцията.

  1. Координаторът изпраща заявка за отмяна: Координаторът изпраща съобщение "отмени" до всички участници.
  2. Участниците отменят: Всеки участник получава заявката за отмяна и отменя всички промени, направени в подготовка за трансакцията.
  3. Участниците изпращат потвърждение: Всеки участник изпраща съобщение за потвърждение обратно до координатора, за да потвърди, че операцията за отмяна е била успешна.
  4. Координаторът завършва: След получаване на потвърждения от всички участници, координаторът маркира трансакцията като завършена.

Примерен пример: Обработка на поръчка в електронна търговия

Представете си система за електронна търговия, където една поръчка включва актуализиране на базата данни за наличностите и обработка на плащането чрез отделен платежен портал. Това са две отделни системи, които трябва да участват в разпределена трансакция.

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

Предимства на двуфазното потвърждение

Недостатъци на двуфазното потвърждение

Алтернативи на двуфазното потвърждение

Поради ограниченията на 2PC, са се появили няколко алтернативни подхода за управление на разпределени трансакции. Те включват:

Практически приложения на двуфазното потвърждение

Въпреки ограниченията си, 2PC все още се използва в различни сценарии, където силната консистентност е критично изискване. Някои примери включват:

Внедряване на двуфазно потвърждение

Внедряването на 2PC изисква внимателно обмисляне на различни фактори, включително:

Глобални аспекти на разпределените трансакции

При проектирането и внедряването на разпределени трансакции в глобална среда трябва да се вземат предвид няколко допълнителни фактора:

Заключение

Разпределените трансакции и двуфазният протокол за потвърждение (2PC) са съществени концепции за изграждането на стабилни и консистентни разпределени системи. Въпреки че 2PC предоставя просто и широко прието решение за гарантиране на атомарност, неговите ограничения, особено около блокирането и единната точка на отказ, налагат внимателно обмисляне на алтернативни подходи като Sagas и крайна консистентност. Разбирането на компромисите между силна консистентност, наличност и производителност е от решаващо значение за избора на правилния подход за вашите специфични нужди на приложението. Освен това, когато се работи в глобална среда, трябва да се обърне внимание на допълнителни аспекти като мрежово забавяне, часови зони, локализация на данни и съответствие с регулациите, за да се гарантира успехът на разпределените трансакции.