Skip to the content.

🧠 Delivery Semantics

When messages/events are sent between systems (like Kafka, RabbitMQ, or a microservice), there are three common delivery guarantees:

  1. At-most-once – message may be delivered once or not at all
  2. At-least-once – message is delivered one or more times
  3. Exactly-once – message is delivered exactly once, no duplicates

We’ll focus on At-least-once vs Exactly-once.


1️⃣ At-Least-Once Delivery

🔹 Example

Suppose a payment system processes an event:

  1. Event sent to service
  2. Service crashes before acknowledging
  3. Event is retried → message processed twice
Event: "Charge $100 to user"
Processing: 2 times → user may get charged twice

✅ Pros: No message lost ❌ Cons: Duplicate messages, need idempotent processing


2️⃣ Exactly-Once Delivery

🔹 Example

Same payment system:

  1. Event sent to service
  2. Service crashes before acknowledging
  3. Event retried
  4. System ensures charge happens only once

✅ Pros: No duplicates, consistent state ❌ Cons: More complex, may impact performance


3️⃣ Comparison Table

Feature At-Least-Once Exactly-Once
Guarantee Process ≥1 times Process =1 time
Risk Duplicates No duplicates
Complexity Low High
Latency Low Higher (transactional overhead)
Implementation Retry logic, idempotent operations Transactions, deduplication, atomic writes
Use Case Logging, analytics, notifications Financial transactions, inventory updates

🔧 How Exactly-Once is Implemented

  1. Idempotent Consumers

    • Consumer ignores duplicate messages based on a unique message ID
  2. Atomic Writes

    • Write to output topic/DB only if processing is successful
  3. Transactional Messaging

    • Systems like Kafka transactions guarantee atomic commit across multiple partitions

🔑 Analogy

Think of mailing letters:


⚡ Summary