[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-chto-takoe-idempotentnost-i-pochemu-ona-vazhna-v-mikroservisakh":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":16,"progress":17,"seo":18},905,"chto-takoe-idempotentnost-i-pochemu-ona-vazhna-v-mikroservisakh",23,"mikroservisy","Микросервисы","🔗","Что такое идемпотентность и почему она важна в микросервисах?","Идемпотентность — это свойство операции, при котором многократное выполнение даёт тот же результат, что и однократное. В микросервисах это гарантирует, что повторная отправка запроса не приводит к дублированию побочных эффектов.\n\n> Аналогия из жизни: нажатие кнопки «Вызвать лифт» — сколько бы раз вы ни нажали, лифт приедет один раз. Повторное нажатие не вызывает второй лифт.\n\n### Почему это критично\n\n- Сетевые сбои: клиент отправил запрос, не получил ответ (таймаут) и повторяет.\n- Retry-механизмы: автоматический retry при ошибке может отправить запрос повторно.\n- Kafka: при ребалансировке потребитель может обработать сообщение дважды (at-least-once delivery).\n\n### Идемпотентность HTTP-методов\n\n| Метод | Идемпотентный? | Пояснение |\n|---|---|---|\n| GET | Да | Чтение не меняет состояние |\n| PUT | Да | Полная замена ресурса |\n| DELETE | Да | Повторное удаление = нет эффекта |\n| POST | Нет | Создание ресурса — требует дополнительных мер |\n\n\u003Cdetails>\u003Csummary>Реализация через Idempotency Key\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Клиент передаёт уникальный ключ идемпотентности\n@PostMapping(\"\u002Fapi\u002Fpayments\")\npublic ResponseEntity\u003CPaymentResponse> createPayment(\n        @RequestHeader(\"Idempotency-Key\") String idempotencyKey,\n        @RequestBody PaymentRequest request) {\n    return paymentService.processPayment(idempotencyKey, request);\n}\n\n@Service\n@RequiredArgsConstructor\npublic class PaymentService {\n    private final PaymentRepository paymentRepository;\n    private final IdempotencyStore idempotencyStore; \u002F\u002F Redis\n\n    @Transactional\n    public ResponseEntity\u003CPaymentResponse> processPayment(\n            String idempotencyKey, PaymentRequest request) {\n\n        \u002F\u002F 1. Проверяем, не обрабатывался ли уже этот запрос\n        Optional\u003CPaymentResponse> existing = idempotencyStore.get(idempotencyKey);\n        if (existing.isPresent()) {\n            return ResponseEntity.ok(existing.get());\n        }\n\n        \u002F\u002F 2. Обрабатываем платёж\n        Payment payment = executePayment(request);\n        PaymentResponse response = toResponse(payment);\n\n        \u002F\u002F 3. Сохраняем результат с TTL\n        idempotencyStore.save(idempotencyKey, response, Duration.ofHours(24));\n\n        return ResponseEntity.status(HttpStatus.CREATED).body(response);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>Идемпотентность Kafka-консьюмера\u003C\u002Fsummary>\n\n```java\n@KafkaListener(topics = \"payment-events\")\npublic void handlePaymentEvent(PaymentEvent event) {\n    \u002F\u002F Проверяем, обрабатывали ли уже это событие\n    if (processedEventRepository.existsByEventId(event.getEventId())) {\n        log.info(\"Событие {} уже обработано, пропускаем\", event.getEventId());\n        return;\n    }\n\n    \u002F\u002F Обрабатываем и помечаем как обработанное в одной транзакции\n    processEvent(event);\n    processedEventRepository.save(new ProcessedEvent(event.getEventId()));\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** объясните через конкретный пример: «если POST \u002Fpayments выполняется дважды — деньги не должны списаться дважды». Покажите решение через Idempotency Key + Redis. Частая ошибка — забыть про идемпотентность Kafka-консьюмеров.","","middle",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое идемпотентность и почему она важна в микросервисах — Gymterview","Идемпотентность — это свойство операции, при котором многократное выполнение даёт тот же результат, что и однократное. В микросервисах это гарантирует, что повт","Идемпотентность — это свойство операции, при котором многократное выполнение даёт тот же результат, что и однократное. В",[15,13],"Идемпотентность — это свойство операции, при котором многократное выполнение даёт тот же результат, что и однократное. В микросервисах это гарантирует, что повторная отправка запроса не приводит к дублированию побочных эффектов.",true]