модуль 3 из 6 · Акт III · ~30 мин · 7 решений
сцена
Три часа ночи. Иван не спит — в переговорке горит свет, на столе остывший кофе, и рядом с Мариной сидит человек, которого он раньше не видел: юрист.
Два инцидента за вечер, оба — про деньги. Тимур, покажи.
Первый: покупателю дважды списали за один и тот же заказ. Он нажал «оплатить», ответ подвис, приложение повторило запрос — и ушли два платежа. Второй хуже: из трёх фермеров с минусом у одного — целых четыре тысячи. Он одновременно вывел деньги в приложении и на сайте; обе операции проверили «баланс хватает» и обе прошли.
А вот в старом монолите такого не было. Одна база, одна транзакция вокруг всего — и хоть ты тресни, дважды не спишешь.
(медленно) Почти, Гена. Гонка могла случиться и в монолите — просто «одна транзакция вокруг всего» её накрывала, и мы жили, не зная. Теперь платежи — отдельный сервис, данные разъехались по шардам, и та самая транзакция больше ничего не накрывает. Мы не завели новую болезнь — распил лишь снял с неё одеяло.
Юрист говорит, второй случай — это уже не бага, это к нам вопросы. К утру мне нужно понимать: почему так вышло и как сделать, чтобы не повторилось. Не «добавили ретраев» — а по-настоящему.
Иван открывает блокнот. На чистой странице выводит два слова: «двойное» и «минус». За ними, он уже чувствует, прячутся две совершенно разные истории.
Один сервис, две ошибки — и причины у них разные. Начнём с той, что попроще.