When working with Apache Kafka, one of the most important questions is:
How many times can a message be delivered to a consumer?
This is called delivery semantics. Kafka supports three modes: at most once, at least once, and exactly once.
1. At Most Once
- Meaning: Each message is delivered 0 or 1 time.
- If there is a failure, the message may be lost.
- No duplicates, but risk of data loss.
How it happens:
- Consumer commits the offset before processing the message.
- If processing fails, Kafka thinks it’s done and skips it.
Example:
- A payment system that commits offset before charging the customer.
- If the app crashes, the payment message is lost and never retried.
Benefits
- Fastest performance (low overhead).
- No duplicates ever appear.
- Simpler logic for consumers.
Drawbacks
- Risk of data loss if a failure happens after offset commit but before processing.
- Not safe for critical workflows.
Use Case:
- OK for non-critical data like metrics, logs, or monitoring signals.
2. At Least Once
- Meaning: Each message is delivered 1 or more times.
- No data loss, but there can be duplicates.
How it happens:
- Consumer commits the offset after processing the message.
- If processing succeeds but commit fails, the same message will be reprocessed.
Example:
- A billing system charges a customer and then crashes before committing.
- On restart, it charges again → duplicate billing.
Benefits
- No message loss (every message is eventually processed).
- Default and safest option in most Kafka clients.
Drawbacks
- Duplicates may occur if the same message is processed multiple times.
- Requires idempotent consumers (processing must handle duplicates safely, e.g., avoid double-charging).
Use Case:
- Most common in Kafka.
- Safe for critical data if your processing is idempotent (can handle duplicates safely).
Pages: 1 2
Category: Kafka