Прямой ответ
Distributed transactions — транзакции, охватывающие несколько сервисов или баз данных (distributed — «распределенные транзакции» — distributed — incident — «несколько сервисов» — distributed), зачем: согласованность в распределенных системах (distributed — «согласованность» — distributed — incident — «согласованность» — distributed — postgres — «распределенные системы» — distributed); паттерны распределенных транзакций (distributed — «паттерны» — distributed): (1) Two-Phase Commit (2PC) (distributed — «двухфазная фиксация» — distributed — incident — «2PC» — distributed — postgres — «координатор + участники» — distributed — 2PC — «2PC» — distributed — «сильная согласованность» — distributed — 2PC); (2) Three-Phase Commit (3PC) (distributed — «трехфазная фиксация» — distributed — incident — «3PC» — distributed — postgres — «улучшение 2PC» — distributed — 2PC — «3PC» — distributed — «меньше блокировок» — distributed — 2PC); (3) Saga pattern (distributed — «сага» — distributed — incident — «последовательность локальных транзакций» — distributed — postgres — «компенсирующие транзакции» — distributed — 2PC — «Saga» — distributed — «eventual consistency» — distributed — Saga); (4) Outbox pattern (distributed — «outbox» — distributed — incident — «локальная транзакция + события» — distributed — postgres — «надежная доставка событий» — distributed — 2PC — «Outbox» — distributed — «eventual consistency» — distributed — Outbox); когда использовать (distributed): 2PC (distributed — «когда нужна сильная согласованность» — distributed — incident — «сильная согласованность» — distributed — postgres — «2PC» — distributed — 2PC — 2PC), Saga (distributed — «когда нужна eventual consistency» — distributed — incident — «eventual» — distributed — postgres — «Saga» — distributed — 2PC — Saga), Outbox (distributed — «когда нужна надежная доставка событий» — distributed — incident — «надежная доставка» — distributed — postgres — «Outbox» — distributed — 2PC — Outbox); антипаттерны: игнорировать паттерны (distributed — «без паттернов» — distributed — incident — «проблемы» — distributed — postgres — «паттерны обязательны» — distributed), неправильный выбор (distributed — «неправильный паттерн» — distributed — incident — «проблемы» — distributed — postgres — «правильный паттерн» — distributed).
Практика: распределенные транзакции
2PC (distributed — координатор + участники (distributed — «координатор» — distributed — postgres — «участники» — distributed — incident — «2PC» — distributed — 2PC — 2PC); Saga (distributed — последовательность локальных транзакций (distributed — «локальные транзакции» — distributed — postgres — «компенсирующие» — distributed — incident — «Saga» — distributed — 2PC — Saga); Outbox (distributed — локальная транзакция + события (distributed — «локальная транзакция» — distributed — postgres — «события» — distributed — incident — «Outbox» — distributed — 2PC — Outbox); Выбор (distributed — по задаче (distributed — «выбор по задаче» — distributed — postgres — «выбор» — distributed — incident — «по задаче» — distributed — 2PC).
Практический сценарий: выбор паттерна распределенных транзакций
Контекст: распределенная система (postgres — нужно выбрать (incident — distributed), боль: согласованность (distributed — «согласованность в распределенных системах» — distributed — incident — «согласованность» — distributed — postgres); решение — distributed transactions: (1) анализ (distributed — что важнее (distributed — «сильная или eventual согласованность» — distributed — postgres — «анализ» — distributed — incident); (2) 2PC (distributed — если нужна сильная согласованность (distributed — «2PC» — distributed — postgres — «сильная» — distributed — 2PC — 2PC); (3) Saga (distributed — если нужна eventual consistency (distributed — «Saga» — distributed — postgres — «eventual» — distributed — 2PC — Saga); (4) Outbox (distributed — если нужна надежная доставка событий (distributed — «Outbox» — distributed — postgres — «надежная доставка» — distributed — 2PC — Outbox); результат: выбор сделан (distributed — «2PC/Saga/Outbox» — distributed — incident — «паттерн выбран» — distributed — postgres — «система выбрана» — distributed); вывод: distributed transactions решили задачу (согласованность в распределенных системах — distributed — ADR — «игнорировать паттерны» — антипаттерн — postgres — паттерны обязательны — distributed — техдолг).
FAQ
Что такое distributed transactions и какие паттерны существуют? Distributed transactions (distributed — транзакции в распределенных системах (distributed — «распределенные транзакции» — distributed — incident — «несколько сервисов» — distributed — postgres); паттерны (distributed): 2PC (distributed — «двухфазная фиксация» — distributed — incident — «2PC» — distributed — postgres — 2PC — 2PC), 3PC (distributed — «трехфазная фиксация» — distributed — incident — «3PC» — distributed — postgres — 2PC — 2PC), Saga (distributed — «сага» — distributed — incident — «Saga» — distributed — postgres — 2PC — Saga), Outbox (distributed — «outbox» — distributed — incident — «Outbox» — distributed — postgres — 2PC — Outbox); «игнорировать паттерны» — антипаттерн (проблемы — postgres — паттерны обязательны — distributed — ADR — техдолг).
Как выбрать между 2PC, Saga и Outbox? Выбор (distributed — по задаче (distributed — «выбор по задаче» — distributed — incident — «по задаче» — distributed — postgres); как: 2PC (distributed — «когда нужна сильная согласованность» — distributed — incident — «сильная согласованность» — distributed — postgres — «2PC» — distributed — 2PC — 2PC), Saga (distributed — «когда нужна eventual consistency» — distributed — incident — «eventual» — distributed — postgres — «Saga» — distributed — 2PC — Saga), Outbox (distributed — «когда нужна надежная доставка событий» — distributed — incident — «надежная доставка» — distributed — postgres — «Outbox» — distributed — 2PC — Outbox); «неправильный выбор» — антипаттерн (проблемы — postgres — правильный выбор — distributed — ADR — техдолг).
Как реализуется Saga pattern и какие у него преимущества? Реализация (distributed — Saga (distributed — «реализация» — distributed — incident — «реализация» — distributed — postgres — 2PC — Saga); как: последовательность локальных транзакций (distributed — «локальные транзакции» — distributed — postgres — «локальные» — distributed — incident — «последовательность» — distributed — 2PC — Saga), компенсирующие транзакции (distributed — «компенсирующие» — distributed — postgres — «компенсирующие» — distributed — incident — «откат» — distributed — 2PC — Saga); преимущества: eventual consistency (distributed — «eventual consistency» — distributed — postgres — «eventual» — distributed — incident — «доступность» — distributed — 2PC — Saga), нет блокировок (distributed — «нет блокировок» — distributed — postgres — «нет блокировок» — distributed — incident — «производительность» — distributed — 2PC — Saga); «игнорировать реализацию» — антипаттерн (проблемы — postgres — понимать реализацию — distributed — ADR — техдолг).
Что такое Outbox pattern и как он обеспечивает надежную доставку событий? Outbox (distributed — паттерн (distributed — «Outbox» — distributed — incident — «Outbox» — distributed — postgres — 2PC — Outbox); как: локальная транзакция (distributed — «локальная транзакция» — distributed — postgres — «локальная» — distributed — incident — «локальная транзакция» — distributed — 2PC — Outbox), таблица outbox (distributed — «таблица outbox» — distributed — postgres — «таблица» — distributed — incident — «outbox» — distributed — 2PC — Outbox), события (distributed — «события сохраняются» — distributed — postgres — «события» — distributed — incident — «сохраняются» — distributed — 2PC — Outbox), доставка (distributed — «события доставляются» — distributed — postgres — «доставляются» — distributed — incident — «надежно» — distributed — 2PC — Outbox); «игнорировать Outbox» — антипаттерн (проблемы — postgres — Outbox важен — distributed — ADR — техдолг).
Источники: Microservices.io (saga, outbox), Wikipedia (2PC), Microservices.io (transactional outbox) — ссылки в шапке.