Распределённые системы
Саги: тест с выбором ответа
Шесть вопросов сквозь весь юнит. Каждый отражает проектное решение, которое ты принимаешь, когда одна транзакция не может охватить работу, — не определение для пересказа, а трейдофф, который надо взвесить, когда частичный отказ это норма.
Убедись, что связываешь воедино, почему 2PC не выживает между сервисами, почему compensation это не rollback, когда choreography бьёт orchestration и какие аномалии следуют из потери изоляции, — синтез, к которому вёл урок.
Путь checkout проходит через шесть сервисов, один из них — сторонний платёжный шлюз. Почему завернуть их в один two-phase commit — ошибка?
Шаг T2 списывает с карты; шаг T3 падает, и сага запускает C2. Что C2 делает на самом деле и почему различие важно?
Сага поездки делает T1 бронь рейса, T2 бронь отеля, T3 аренда машины, затем списание карты, затем письмо-подтверждение. Почему сеньор ставит шаги именно так?
Процесс заказа из 6 шагов охватывает 5 сервисов с ретраями, таймаутами и шагом ручного одобрения, который может ждать дни. Choreography или orchestration?
Сага B читает заказ, который сага A закоммитила, но позже компенсирует, и действует на нём. Какая это аномалия и почему она вообще возможна?
Две саги одновременно меняют один баланс счёта, и одна затирает изменение другой. Какая контрмера убирает этот lost update напрямую?
Сквозная линия: одна ACID-транзакция не может охватить сервисы, а лекарство 2PC — межсервисные блокировки плюс блокирующий координатор — хуже болезни. Сага отказывается от глобальной транзакции ради локальных коммитов плюс написанных руками компенсаций, которые суть новые прямые действия, а не rollback, поэтому необратимые шаги ставишь последними. Шаги связываешь choreography (децентрализованно, но размазано) или orchestration (одно durable место для чтения и продолжения), а за потерю изоляции платишь защитой на уровне приложения — semantic lock, коммутативные обновления, проверка версии — против dirty read и lost update.