At-least-once: every message is processed one or more times (retries can cause duplicates). Exactly-once: every message is processed precisely once — no duplicates, no drops. Exactly-once is harder to achieve in distributed systems; at-least-once is simpler but requires idempotent handling of duplicates.
| Semantic | Guarantee | How |
|---|---|---|
| At-least-once | No message lost; may duplicate | Retry until ack; consumer idempotent |
| Exactly-once | Processed once | Idempotency keys, transactional outbox, or system support (e.g. Kafka exactly-once) |
Design for at-least-once and make consumers idempotent (e.g. by message ID or business key). Add exactly-once semantics only where needed (e.g. payments) using deduplication or transactional patterns.