Idempotency key на собеседовании системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем спрашивают на собесе SA

Idempotency — основа safe APIs. На собесе SA: «как сделать POST идемпотентным», «что в Idempotency-Key».

Идея

POST по semantic non-idempotent — может create row at каждый retry.

Idempotency key — client-generated unique ID, sent with request. Server detects duplicate retry, returns same response.

POST /payments
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Body: {"amount": 100, "card": "..."}

→ 201 Created, payment ID = 42

# retry с тем же key
POST /payments
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

→ 201 Created, payment ID = 42  (same response, не new payment)

Header convention

Idempotency-Key — стандарт de facto (Stripe popularized).

Format. UUID typically. Любая unique строка.

Generation. Client-side. Один key per logical operation. Persisted in client storage пока not confirmed.

Server-side dedupe

CREATE TABLE idempotency_keys (
  key TEXT PRIMARY KEY,
  user_id BIGINT,
  request_hash TEXT,    -- хеш request body
  response JSON,         -- saved response
  status_code INT,
  created_at TIMESTAMP
);

Алгоритм:

  1. Get key from header.
  2. SELECT from idempotency_keys.
  3. If exists:
    • Compare request_hash. Если разный — error 422 «Idempotency key reused with different body».
    • Return saved response.
  4. If not exists:
    • Process request.
    • INSERT key + response.
    • Return.

Race condition. Concurrent requests с тем же key — нужен lock. SELECT FOR UPDATE или unique constraint check.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

TTL и cleanup

Идемpoпotency keys накапливаются. TTL — 24h-7d typically.

DELETE FROM idempotency_keys WHERE created_at < NOW() - INTERVAL '7 days';

После TTL — same key может быть переиспользован (для another logical op).

Применение

Payment APIs. Stripe, PayPal — обязательно.

Order creation. Чтобы pet retry не создавал second order.

Webhooks. Receivers идемпотентны через key (или event ID).

Bank transfers. Critical — двойное списание = catastrophe.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на конвенциях Stripe / Square / payment industry.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.