Выбор ответа Middle Проектирование API обновлено
Двойное списание при повторе
Вопрос
Мобильное приложение отправило POST /payments, соединение оборвалось до ответа, и приложение повторило запрос. Деньги списались дважды. Как правильно исправить?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Клиент шлёт Idempotency-Key, сервер на повтор с ним отдаёт сохранённый результат. Ключ идемпотентности превращает повтор POST в безопасную операцию, сервер дедуплицирует по ключу.
Варианты ответа
- Поменять POST на GET: GET идемпотентен, поэтому повтор не спишет деньги второй раз
- Запретить клиенту повторять запросы и показывать пользователю ошибку при обрыве сети
- Клиент шлёт Idempotency-Key, сервер на повтор с ним отдаёт сохранённый результатправильный ответ
- Добавить в ответ
Cache-Control: no-store, чтобы прокси не переиграл запрос повторно
Разбор
Ключ идемпотентности превращает повтор POST в безопасную операцию, сервер дедуплицирует по ключу. GET для изменений нарушает семантику HTTP и сам ничего не дедуплицирует. Без ретраев платёж может потеряться: клиент не узнает, прошёл ли он. Заголовки кеширования не влияют на повторную обработку POST.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.