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