[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-arkhitektura-prilozheniy-chto-takoe-idempotentnost-operatsiy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},136,"chto-takoe-idempotentnost-operatsiy",3,"arkhitektura-prilozheniy","Архитектура приложений","🏗️","Что такое идемпотентность операций?","Идемпотентность -- свойство операции, при котором многократное выполнение с одними и теми же входными данными даёт тот же результат, что и однократное выполнение. Как нажатие кнопки \"вызвать лифт\" -- сколько ни нажимай, лифт приедет один раз.\n\n```\nИдемпотентная операция:\n  f(x) = f(f(x))\n\n  Перевести статус заказа в \"ОПЛАЧЕН\" -- можно вызвать 100 раз, результат один.\n  GET \u002Fapi\u002Faccounts\u002F123 -- сколько ни вызывай, данные не изменятся.\n\nНЕ идемпотентная операция:\n  \"Пополнить счёт на 1000 руб.\" -- при повторном вызове сумма удвоится!\n```\n\n### HTTP-методы и идемпотентность\n\n| Метод | Идемпотентный | Безопасный |\n|-------|:------------:|:---------:|\n| GET | Да | Да |\n| HEAD | Да | Да |\n| PUT | Да | Нет |\n| DELETE | Да | Нет |\n| POST | Нет | Нет |\n| PATCH | Нет | Нет |\n\n### Почему это критично\n\n- Сетевые сбои -- клиент не получил ответ и повторяет запрос.\n- Retry-политики в микросервисах -- повторные попытки при таймауте.\n- Дублирование сообщений в очередях (at-least-once delivery в Kafka).\n- В финансовых системах повторный вызов может привести к двойному списанию или зачислению.\n\n### Способы обеспечения идемпотентности\n\n### 1. Idempotency Key\n\nКлиент передаёт уникальный ключ. Сервер проверяет, обрабатывалась ли операция с таким ключом, и при повторном запросе возвращает сохранённый результат.\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n@PostMapping(\"\u002Fpayments\")\npublic ResponseEntity\u003CPaymentResult> createPayment(\n        @RequestHeader(\"Idempotency-Key\") String idempotencyKey,\n        @RequestBody CreatePaymentRequest request) {\n\n    \u002F\u002F Проверяем, не обрабатывали ли мы уже этот запрос\n    Optional\u003CPaymentResult> existing = idempotencyStore.find(idempotencyKey);\n    if (existing.isPresent()) {\n        return ResponseEntity.ok(existing.get());  \u002F\u002F возвращаем прежний результат\n    }\n\n    PaymentResult result = paymentService.create(request);\n    idempotencyStore.save(idempotencyKey, result);\n    return ResponseEntity.status(HttpStatus.CREATED).body(result);\n}\n```\n\n\u003C\u002Fdetails>\n\n### 2. Условные операции\n\nИспользование версий, ETag или условных обновлений в БД:\n\n```sql\n-- Идемпотентное обновление: статус изменится только один раз\nUPDATE payments SET status = 'COMPLETED'\nWHERE id = :id AND status = 'PENDING';\n```\n\n### 3. Естественная идемпотентность\n\nПроектирование операций как установка конечного состояния, а не как приращение:\n\n```java\n\u002F\u002F Не идемпотентно:\naccount.addBalance(1000);  \u002F\u002F при повторе удвоится\n\n\u002F\u002F Идемпотентно:\naccount.setBalance(5000);  \u002F\u002F при повторе результат тот же\n```\n\n### Итог\n\nПри проектировании API и обработчиков событий всегда задавайте вопрос: \"Что произойдёт, если эта операция выполнится дважды?\" Если ответ \"ничего страшного\" -- операция идемпотентна. Если нет -- нужен один из описанных механизмов защиты.\n\n> **На собеседовании:** Интервьюер хочет услышать конкретные способы обеспечения идемпотентности (Idempotency Key, условные обновления), а не только определение. Частая ошибка -- утверждать, что DELETE всегда идемпотентен, забывая о побочных эффектах (события, триггеры).","","middle",[15,16,17,18],"rest-api","idempotency","reliability","architecture",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":31,"featuredSnippetReady":32},"Идемпотентность операций: определение и способы обеспечения — Gymterview","Что такое идемпотентность? Идемпотентность HTTP-методов, Idempotency Key, условные операции. Почему это критично в банковских системах и микросервисах.","Что такое идемпотентность операций? Способы обеспечения: Idempotency Key, условные операции, проектирование идемпотентных API.",[26,16,27,28,29,30],"идемпотентность","idempotency key","HTTP методы","идемпотентные операции","REST API","Идемпотентность — свойство операции, при котором многократное выполнение с одними и теми же входными данными даёт тот же результат, что и однократное. HTTP-методы GET, PUT, DELETE идемпотентны, а POST и PATCH — нет. Это критично при сетевых сбоях, retry-политиках и дублировании сообщений в очередях. Основные способы обеспечения: Idempotency Key (уникальный ключ от клиента), условные операции в БД и проектирование операций как установка состояния вместо приращения.",true]