Согласованность данных между сервисами
Вопрос
Как вы обеспечиваете согласованность данных между микросервисами без распределённых транзакций?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
База на сервис, нет 2PC
Саги: локальные транзакции и компенсации, хореография или оркестрация
Outbox для надёжной публикации событий
At-least-once доставка и идемпотентные потребители
Eventual consistency и как её показывать пользователю
Мониторинг зависших саг и ручной разбор
Что могут спросить следом
- Хореография или оркестрация: что выбрать?
- Как сделать потребителя идемпотентным?
Разбор
Каждый сервис владеет своей базой, а распределённые транзакции через 2PC не использую: они хрупкие и плохо масштабируются. Бизнес-операцию, затрагивающую несколько сервисов, оформляю сагой: каждый шаг это локальная транзакция, на сбой есть компенсация, например отмена резерва на складе и возврат платежа. Простые цепочки делаю хореографией через события, сложные с ветвлениями оркестратором, где состояние саги видно в одном месте. События публикую через transactional outbox, чтобы изменение данных и событие не разъезжались. Доставка at-least-once, поэтому потребители идемпотентны: храню id обработанных событий или делаю операции естественно идемпотентными. Пользователь видит промежуточные статусы вроде «оплата обрабатывается». Зависшие саги мониторю и разбираю.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.