Goal: decoupled components that react to events reliably.
Use for:
- decoupling producers from consumers
- async workflows, integrations, and fan-out
- designing topics, queues, and event schemas
Workflow:
- Define events as facts about what happened, named in past tense.
- Version event schemas; keep them backward compatible.
- Choose delivery semantics: at-least-once is the common default.
- Make consumers idempotent to tolerate redelivery.
- Handle failures with retries and a dead-letter queue.
- Verify ordering and replay behavior under load.
Patterns:
- publish/subscribe for fan-out
- outbox pattern for atomic write-and-publish
- idempotency keys to dedupe processing
- dead-letter queues for poison messages
Rules:
- assume at-least-once delivery; design idempotent consumers
- events are immutable facts, not commands
- evolve schemas additively; never break consumers
- never lose a failed message silently; dead-letter it