TGViewer
System Design | balun.courses System Design | balun.courses @balun_courses_system_design · 348 subscribers
Post #24 394
Нажал «Оплатить» один раз. Деньги списались трижды...

Пользователь отправляет запрос на оплату. Сервер успевает провести операцию, но ответ теряется из-за сетевого сбоя.

Для клиента это выглядит так, будто ничего не произошло. Он повторяет запрос. Потом ещё раз.

В распределённой системе такой сценарий нормален: запрос может успешно выполниться, а ответ – не дойти обратно. Проблема начинается, если каждый retry повторно меняет состояние системы, то есть три запроса превращаются в три списания.

Здесь нужна идемпотентность: запрос можно повторить несколько раз, но бизнес-эффект останется таким же, как после одного выполнения.


Один из распространённых способов это реализовать – ключ идемпотентности. Клиент отправляет вместе с запросом уникальный ключ, а сервер связывает все повторы с одной и той же операцией.

❗️Но просто добавить поле ключ идемпотентности недостаточно.

Ключ должен видеть любой инстанс сервиса. Его регистрация должна быть атомарной, а повторный запрос должен получать статус или результат первой операции.

Есть и более неприятный сценарий: деньги уже списал внешний провайдер, а ваш сервис упал до того, как сохранил результат. Тогда одной локальной транзакции уже недостаточно – нужна идемпотентность на стороне провайдера или reconciliation.

На картинках как раз разобрали весь путь по шагам:
• как возникает проблема с повторными списаниями;
• что меняет ключ идемпотентности;
• где чаще всего ошибаются в реализации;
• и почему внешний платёжный провайдер добавляет ещё один сложный edge case.

Поэтому перед добавлением retry полезно задавать не только вопрос «сколько раз повторяем?», но и другой:

«Что произойдёт, если эта операция выполнится дважды?»

Какие ещё операции, кроме платежей, вы бы обязательно делали идемпотентными?
  • ❤ 5
  • 👍 3
  • 🔥 2
More from @balun_courses_system_design
  1. Sep 18, 2026Retry спасает от ошибок. И иногда превращает 10 000 запросов в 40 000 Сервис B начал тормо…
  2. Sep 1, 2026Реально ли пройти курс по System Design, если у вас full-time работа? Да. Но 4 недели прид…
  3. Aug 28, 2026Вы посмотрели 20 разборов System Design. А сможете спроектировать систему с нуля? Пока смо…
  4. Aug 21, 2026Архитектурные созвоны бывают очень разными. Но некоторые фразы, кажется, кочуют из команды…
  5. Aug 18, 2026За 4 недели – от идеи до архитектуры полноценного проекта На первом занятии курса по Syste…
  6. Aug 17, 2026Среднее значение здесь почти ничего не говорит о проблеме: большинство запросов действител…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →