Вопрос проверяет понимание идемпотентности, надежности API и проектирования платежных систем.
Для различения повторного запроса и повторной доставки используют идемпотентные ключи. Клиент передает уникальный idempotency key, который сервер сохраняет вместе с результатом операции. При повторном запросе с тем же ключом сервер возвращает прежний результат вместо повторного выполнения операции. Это предотвращает двойные списания.
В платежных системах повторные запросы возникают из-за:
Повторной отправки пользователем
Повторов со стороны сети или балансировщика
Повторной доставки сообщений
Без защиты это может привести к двойным списаниям.
Определение:
Идемпотентность — это свойство операции, при котором повторный вызов с теми же параметрами дает тот же результат без повторного выполнения.
Алгоритм работы:
Клиент генерирует уникальный ключ
Отправляет его в заголовке или теле запроса
Сервер сохраняет ключ и результат операции
При повторном запросе возвращает сохраненный результат
Пример:
POST /payments
Idempotency-Key: abc123
Часто используют:
Redis
PostgreSQL
специализированный storage
Ключ должен быть уникален для операции
Нужно хранить статус операции
Нужно обрабатывать частично завершенные операции
Идемпотентные ключи — основной механизм защиты платежных API от повторного выполнения операций.