Что означает идемпотентность метода в контексте API?

«Что означает идемпотентность метода в контексте API?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Идемпотентность метода — это свойство, означающее, что многократное выполнение одной и той же операции с одинаковыми входными данными даёт тот же результат, что и однократное выполнение, и не вызывает дополнительных изменений состояния системы после первого успешного вызова.

Практическое значение:

Это ключевое свойство для обеспечения надёжности распределённых систем, так как клиенты могут безопасно повторять запросы при сбоях сети, не опасаясь побочных эффектов (например, списания денег дважды).

Примеры в HTTP:

Метод Идемпотентен? Почему
GET Да Получение данных. Повторные запросы не изменяют состояние.
PUT Да Обновление ресурса. PUT /users/1 {name: "Alice"} при повторении всегда оставит пользователя с name:"Alice".
DELETE Да Удаление ресурса. После первого успешного удаления ресурса его больше нет, последующие вызовы вернут 404 (Not Found), что является тем же итоговым состоянием.
POST Нет Создание ресурса. Каждый вызов POST /users создаст нового пользователя.
PATCH Обычно нет Частичное обновление. Например, PATCH /users/1 {balance: +100} при повторе увеличит баланс дважды.

Как обеспечить идемпотентность?

Для неидемпотентных операций (например, списание средств) используют:

  1. Идемпотентные ключи (Idempotency-Key): Клиент отправляет уникальный ключ с запросом. Сервер запоминает результат первой обработки и для повторных запросов с тем же ключом возвращает сохранённый ответ, не выполняя операцию заново.
  2. Оптимистичные блокировки: Использование версий (version или ETag) для предотвращения "потерянных" обновлений.