Как обрабатывать distributed transactions?

Senior
357 просмотров
AFK Offer AI

В микросервисах классический ACID-transaction через несколько сервисов невозможен — каждый сервис имеет свою БД. Есть несколько подходов.

2PC (Two-Phase Commit): координатор спрашивает "готовы?" (prepare), все отвечают "да" → координатор говорит "commit". Проблема: если координатор упал между prepare и commit — все залочены. В микросервисах почти не используется.

Saga: цепочка локальных транзакций с компенсациями. Самый популярный подход для микросервисов.

Outbox pattern: запись в БД + событие в одной локальной транзакции. Отдельный процесс читает outbox и публикует в Kafka.

// внутри одной транзакции:
tx.Exec("INSERT INTO orders ...")
tx.Exec("INSERT INTO outbox (event_type, payload) VALUES ('order_created', $1)", payload)
tx.Commit()

На практике комбинация: Saga для оркестрации + Outbox для надёжной публикации событий + идемпотентные обработчики для защиты от дубликатов.

Следующий вопрос

Что такое dead tuple?