Двойные списания после автоматических повторов POST-запроса на оплату
В сетевом слое настроены повторы: при таймауте запрос отправляется заново, до трёх попыток. Таймаут — 10 секунд.
После релиза поддержка получает жалобы: у части пользователей списалось дважды за один заказ. В логах бэкенда видно два платежа, созданные с разницей в 10 секунд.
Что здесь неверно?
- Ошибка на бэкенде: клиент повторяет запрос корректно, менять на мобильной стороне нечего
- Достаточно увеличить таймаут до 60 секунд — повторов не будет, а значит не будет и дублей: причина проблемы именно в слишком коротком таймауте
- Таймаут не означает, что сервер не обработал запрос: повтор неидемпотентной операции нужно делать с ключом идемпотентности либо сначала проверять статус операции
- Повторять нельзя только ответы 5xx, а при таймауте повтор безопасен всегда: раз ответа нет, значит запрос до сервера не дошёл и платёж создан не был
