← Back to microservices patterns map
📤
Microservices Pattern

Outbox + Inbox Pattern

Use outbox records for reliable sends and inbox records for idempotent receives.

consistency

Detailed Description

Outbox solves reliable event publishing. Inbox solves duplicate event processing.

Together they create practical exactly-once effects over systems that normally deliver at least once.

Visual Diagram

Outbox (sender side)
  BEGIN TX:
    INSERT orders  → order data
    INSERT outbox  → { msgId, event, status:pending }
  COMMIT
  Poller: read outbox → publish to Kafka → mark sent

Inbox (receiver side)
  Receive event { msgId: "m-456" }
  CHECK inbox table: msgId=m-456 exists?
  → YES: already processed, skip (idempotent)
  → NO:  process + INSERT inbox(m-456)

Tradeoffs

Pros

Reliable delivery and deduplication

Cons

Inbox/outbox cleanup and operational complexity

Examples: Debezium outbox, custom outbox poller, inbox table