Inbox pattern на собеседовании системного аналитика

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

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

Зачем inbox

Symmetric к outbox. Inbox — на receiving side.

Problem. At-least-once delivery → duplicates. Receiver обрабатывает event дважды.

Solution. Save event в inbox table. Process once. Subsequent deliveries — ignored.

Implementation

CREATE TABLE inbox (
  event_id TEXT PRIMARY KEY,
  payload JSON,
  received_at TIMESTAMP DEFAULT NOW(),
  processed BOOLEAN DEFAULT FALSE,
  processed_at TIMESTAMP
);

-- on receive
INSERT INTO inbox (event_id, payload) VALUES (...) ON CONFLICT DO NOTHING;
COMMIT;

-- worker processes
SELECT * FROM inbox WHERE NOT processed FOR UPDATE SKIP LOCKED LIMIT 100;
-- process
UPDATE inbox SET processed = TRUE, processed_at = NOW() WHERE event_id = ...;

Idempotency

ON CONFLICT DO NOTHING — duplicate insert ignored. Event_id PK gives this.

Processing — happens только once (worker locks row).

Result published / saved — atomic с processed=true.

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

Ordering

Если order matters — process events in order.

Per-aggregate ordering. Events для same Order processed sequentially. Different Orders — parallel.

SELECT * FROM inbox WHERE NOT processed AND aggregate_id = $X
ORDER BY received_at LIMIT 1;

Per-aggregate worker / queue.

В Kafka — same partition guarantees order. Inbox preserves через aggregate_id grouping.

Vs outbox

Outbox Inbox
Side Producer Consumer
Goal Reliable delivery Reliable processing
Solves Dual write problem Dedup deliveries
Pattern Persist outgoing event Persist incoming event

Both часто used together — outbox publishes, inbox consumes. End-to-end atomic.

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

FAQ

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

Нет. Статья основана на работах Chris Richardson (microservices.io).


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