← Назад к вопросам

Что такое идемпотентность?

1.8 Middle🔥 221 комментариев
#API и сетевые протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Идемпотентность

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

Математическое определение

Математически идемпотентная функция f(x) удовлетворяет условию:

f(f(x)) = f(x)

Применительно к операциям в системах это означает, что множественные вызовы приводят к одному и тому же результату, как если бы операция была вызвана один раз.

HTTP и идемпотентность

В контексте HTTP методы разделяются на идемпотентные и неидемпотентные:

Идемпотентные методы:

  • GET — получение данных не изменяет состояние
  • PUT — обновление ресурса даёт одинаковый результат при повторении
  • DELETE — удаление ресурса, повторное удаление не меняет результат
  • HEAD — не изменяет состояние
  • OPTIONS — получение информации о методах

Неидемпотентные методы:

  • POST — каждый вызов может создавать новый ресурс
  • PATCH — может давать разные результаты при повторении

Примеры в разработке

Пример 1: Payment API

// Неидемпотентный запрос
POST /api/payments
{ amount: 100 }
// Первый вызов: платёж создан, transactionId = tx_123
// Второй вызов: новый платёж создан, transactionId = tx_124

// Идемпотентный запрос
POST /api/payments
Idempotency-Key: user_123_purchase_order_456
{ amount: 100 }
// Первый вызов: платёж создан, transactionId = tx_123
// Второй вызов: возвращается результат первого, transactionId = tx_123

Пример 2: Database UPDATE

// Идемпотентно
UPDATE users SET name = John WHERE id = 1;
// Выполнение 1, 2, 3 раза = одинаковый результат

// Неидемпотентно
UPDATE users SET balance = balance - 100 WHERE id = 1;
// Выполнение 1: balance 1000 -> 900
// Выполнение 2: balance 900 -> 800

Практическая реализация

app.post('/charge', async (req, res) => {
  const { amount, idempotencyKey } = req.body;
  
  const cached = await redis.get('idempotency:' + idempotencyKey);
  if (cached) {
    return res.json(JSON.parse(cached));
  }
  
  const result = await paymentGateway.charge(amount);
  await redis.setex('idempotency:' + idempotencyKey, 3600, JSON.stringify(result));
  
  res.json(result);
});

Стратегии

  • Idempotency Key — уникальный идентификатор операции
  • Deduplication — проверка дублей перед выполнением
  • State machines — переходы состояний гарантируют одинаковый результат
  • Transactions — ACID гарантирует консистентность

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