Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
Сеть не даёт понять, дошёл ли запрос: ответ мог потеряться после успешной оплаты. Клиент повторяет запрос, и без защиты деньги спишутся дважды.
- Клиент создаёт ключ на операцию, например UUID, и шлёт его в заголовке
Idempotency-Keyпри каждом повторе. - Сервер вставляет ключ в таблицу с уникальным ограничением до начала операции и после неё сохраняет ответ.
- Повтор с тем же ключом получает сохранённый ответ.
- Тот же ключ с другим телом запроса — ошибка: это другая операция.
CREATE TABLE idempotency_key (
key uuid PRIMARY KEY,
request_sha text NOT NULL,
status text NOT NULL, -- processing | done
response jsonb,
created_at timestamptz NOT NULL DEFAULT now()
);Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Что делать, если повтор пришёл, пока первый запрос ещё выполняется?
Ответ уровня Middle
Ключ уже есть со статусом processing: вернуть 409 и попросить повторить позже. Вторую оплату запускать нельзя.
Типичные ошибки
- Генерировать ключ на сервере: тогда повтор клиента получит новый ключ.
- Сохранять ключ после операции, а не до неё.
Первоисточники
Быстрые задания по теме
Для темы «Идемпотентность и повторы» быстрых заданий пока нет
Можно проверить всю зону «Согласованность данных» тестом на 10 минут.
Проверить себя за 10 минут