Выбор ответа Middle Надёжность и наблюдаемость спрашивают часто обновлено

Ретрай неидемпотентного запроса

Вопрос

Клиент автоматически повторяет POST /orders при таймауте. Какая проблема возможна и как её закрыть?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Создастся два заказа; нужен Idempotency-Key на сервере. Таймаут не значит, что запрос не выполнился: заказ мог создаться, а ответ потеряться.

Варианты ответа

  1. Проблем нет: POST идемпотентен по спецификации HTTP
  2. Сервер вернёт 405 на повторный POST с тем же телом
  3. Повтор нужно делать через PUT на тот же адрес /orders
  4. Создастся два заказа; нужен Idempotency-Key на сервереправильный ответ

Разбор

Таймаут не значит, что запрос не выполнился: заказ мог создаться, а ответ потеряться. Повтор POST создаст дубль. Ключ идемпотентности позволяет серверу узнать повтор и вернуть первый результат. POST по спецификации HTTP не идемпотентен, 405 тут ни при чём, а смена метода на PUT без смены семантики (PUT по известному id) ничего не решает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.