Message Queue Fundamentals

Message Queue Fundamentals

Difficulty: ⭐⭐⭐

Overview

Message queues are essential infrastructure enabling asynchronous communication between services in distributed systems. This chapter covers the differences between synchronous and asynchronous communication, queue vs topic concepts, message delivery guarantees, and idempotency.


Table of Contents

  1. Synchronous vs Asynchronous Communication
  2. Benefits of Message Queues
  3. Queue vs Topic
  4. Message Delivery Guarantees
  5. Idempotency
  6. Message Queue Patterns
  7. Practice Problems

1. Synchronous vs Asynchronous Communication

Synchronous Communication

Waiting for a response after making a request.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Synchronous (Request-Response)                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
β”‚  β”‚ Service Aβ”‚                           β”‚ Service Bβ”‚                   β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                           β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                   β”‚
β”‚       β”‚                                      β”‚                          β”‚
β”‚       │─────── HTTP Request ────────────────►│                          β”‚
β”‚       β”‚                                      β”‚                          β”‚
β”‚       β”‚        (Service A blocked)           β”‚ Processing...            β”‚
β”‚       β”‚        Request thread waiting        β”‚                          β”‚
β”‚       β”‚                                      β”‚                          β”‚
β”‚       │◄────── HTTP Response ───────────────│                          β”‚
β”‚       β”‚                                      β”‚                          β”‚
β”‚       β–Ό                                      β–Ό                          β”‚
β”‚  Continue next task                    Processing complete              β”‚
β”‚                                                                         β”‚
β”‚  Characteristics:                                                       β”‚
β”‚  - Immediate response required                                          β”‚
β”‚  - Caller waits for response                                            β”‚
β”‚  - Service A affected when Service B fails                              β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Asynchronous Communication

Send a message and immediately continue with other tasks.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Asynchronous (Message Queue)                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
β”‚  β”‚ Service Aβ”‚     β”‚ Message Queueβ”‚     β”‚ Service Bβ”‚                   β”‚
β”‚  β”‚(Producer)β”‚     β”‚              β”‚     β”‚(Consumer)β”‚                   β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                   β”‚
β”‚       β”‚                  β”‚                  β”‚                          β”‚
β”‚       │──── Send Msg ───►│                  β”‚                          β”‚
β”‚       │◄─── ACK ─────────│                  β”‚                          β”‚
β”‚       β”‚                  β”‚                  β”‚                          β”‚
β”‚       β–Ό                  β”‚                  β”‚                          β”‚
β”‚  Continue next task      │◄─── Poll ────────│                          β”‚
β”‚  (no blocking)           │──── Deliver ────►│                          β”‚
β”‚                          β”‚                  β”‚ Processing...            β”‚
β”‚                          │◄─── ACK ─────────│                          β”‚
β”‚                          β”‚                  β–Ό                          β”‚
β”‚                          β”‚             Processing complete             β”‚
β”‚                                                                         β”‚
β”‚  Characteristics:                                                       β”‚
β”‚  - Sender/receiver independent                                          β”‚
β”‚  - Loose coupling                                                       β”‚
β”‚  - Service A operates normally even when Service B fails                β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Communication Methods Comparison

Characteristic Synchronous Asynchronous
Wait for response Required Not required
Coupling Strong Loose
Failure propagation Immediate Isolated
Real-time nature Immediate Can be delayed
Complexity Low High
Throughput Limited High

2. Benefits of Message Queues

Decoupling

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Tight Coupling vs Loose Coupling                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Tight Coupling (synchronous):                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”                          β”‚
β”‚  β”‚  A  │────►│  B  │────►│  C  │────►│  D  β”‚                          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”˜                          β”‚
β”‚     β”‚                       X Failure!                                  β”‚
β”‚     β–Ό                                                                   β”‚
β”‚  A also fails! (Wait for B β†’ C fails β†’ entire failure)                 β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Loose Coupling (asynchronous):                                        β”‚
β”‚                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                   β”‚
β”‚                      β”‚   Message   β”‚                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”            β”‚    Queue    β”‚            β”Œβ”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚  A  │───publishβ”€β”€β–Ίβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β—„β”€β”€consume──│  B  β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”˜            β”‚  [msg][msg] β”‚            β””β”€β”€β”€β”€β”€β”˜                β”‚
β”‚     β”‚               β”‚  [msg][msg] β”‚               X Failure!           β”‚
β”‚     β–Ό               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                    β”‚
β”‚  A continues!                                                          β”‚
β”‚  (Messages stored in queue, processed after B recovers)                β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Load Leveling

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Load Leveling                                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Without Queue (direct call):                                          β”‚
β”‚                                                                         β”‚
β”‚  Request    β”‚    β–ˆβ–ˆβ–ˆβ–ˆ                                                  β”‚
β”‚  volume     β”‚    β–ˆβ–ˆβ–ˆβ–ˆ ← Server overload at peak!                       β”‚
β”‚  Processing β”‚ β”€β”€β”€β–ˆβ–ˆβ–ˆβ–ˆβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                                     β”‚
β”‚  capacity   β”‚    β–ˆβ–ˆβ–ˆβ–ˆ                                                  β”‚
β”‚             └────────────────────────► Time                            β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  With Queue (buffering):                                               β”‚
β”‚                                                                         β”‚
β”‚  Request    β”‚    β–ˆβ–ˆβ–ˆβ–ˆ                                                  β”‚
β”‚  volume     β”‚    β–ˆβ–ˆβ–ˆβ–ˆ                                                  β”‚
β”‚  Queue      β”‚ β”€β”€β”€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ”€β”€                                        β”‚
β”‚  size       β”‚    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ                                          β”‚
β”‚  Processing β”‚ ═══════════════════════ ← Steady processing              β”‚
β”‚             └────────────────────────► Time                            β”‚
β”‚                                                                         β”‚
β”‚  Queue acts as buffer:                                                 β”‚
β”‚  - Absorb peak traffic                                                 β”‚
β”‚  - Consumer processes at steady rate                                   β”‚
β”‚  - Improved system stability                                           β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Scalability

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Horizontal Scaling                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                            β”‚
β”‚              β”‚  Message   β”‚                                            β”‚
β”‚              β”‚   Queue    β”‚                                            β”‚
β”‚              β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                                            β”‚
β”‚  Producer───►│ [m1][m2]   β”‚                                            β”‚
β”‚              β”‚ [m3][m4]   β”‚                                            β”‚
β”‚              β”‚ [m5][m6]   β”‚                                            β”‚
β”‚              β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                                            β”‚
β”‚                    β”‚                                                    β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                        β”‚
β”‚         β–Ό          β–Ό          β–Ό                                        β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                β”‚
β”‚    β”‚Consumer1β”‚ β”‚Consumer2β”‚ β”‚Consumer3β”‚                                β”‚
β”‚    β”‚  (m1)   β”‚ β”‚  (m2)   β”‚ β”‚  (m3)   β”‚                                β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                β”‚
β”‚                                                                         β”‚
β”‚  To increase throughput:                                                β”‚
β”‚  - Just add more consumers                                              β”‚
β”‚  - No producer code changes needed                                      β”‚
β”‚  - Messages automatically distributed to consumers                      β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Durability

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Message Persistence                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚  β”‚ Producer │────►│ Message Queue (Durable)  β”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                        β”‚
β”‚                   β”‚  Memory                   β”‚                        β”‚
β”‚                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚                        β”‚
β”‚                   β”‚  β”‚ [msg1] [msg2]    β”‚    β”‚                        β”‚
β”‚                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚                        β”‚
β”‚                   β”‚           β”‚              β”‚                        β”‚
β”‚                   β”‚           β–Ό              β”‚                        β”‚
β”‚                   β”‚  Disk (WAL)              β”‚                        β”‚
β”‚                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚                        β”‚
β”‚                   β”‚  β”‚ msg1, msg2, ...  β”‚    β”‚                        β”‚
β”‚                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚                        β”‚
β”‚                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚                                                                         β”‚
β”‚  Failure recovery:                                                      β”‚
β”‚  1. Broker restarts                                                     β”‚
β”‚  2. Restore messages from disk                                          β”‚
β”‚  3. Resend to consumers                                                 β”‚
β”‚  β†’ Prevent message loss                                                 β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Queue vs Topic

Point-to-Point (Queue)

One message is processed by only one consumer.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Point-to-Point (Queue)                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚      Queue        β”‚                          β”‚
β”‚  β”‚Producer 1│─────────►│ β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β” β”‚                          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ β”‚ A β”‚ B β”‚ C β”‚ D β”‚ β”‚                          β”‚
β”‚                        β”‚ β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜ β”‚                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚                   β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚Producer 2│─────────►│ Each message      │─────────►│Consumer 1β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ processed by only β”‚   A,C    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                        β”‚ one consumer      β”‚                          β”‚
β”‚                        β”‚                   β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚                        β”‚                   │─────────►│Consumer 2β”‚    β”‚
β”‚                        β”‚                   β”‚   B,D    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚
β”‚                                                                         β”‚
β”‚  Use cases:                                                             β”‚
β”‚  - Work distribution (Work Queue)                                       β”‚
β”‚  - Order processing                                                     β”‚
β”‚  - Email sending queue                                                  β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Publish/Subscribe (Topic)

One message is delivered to all subscribers.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Publish/Subscribe (Topic)                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚      Topic        β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚Publisher │─────────►│ β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β” │────────►│Subscriber 1β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ β”‚ A β”‚ B β”‚ C β”‚ D β”‚ β”‚  A,B,   β”‚ (all msgs) β”‚   β”‚
β”‚                        β”‚ β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜ β”‚  C,D    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                        β”‚                   β”‚                          β”‚
β”‚                        β”‚ All subscribers   β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                        β”‚ receive all       │────────►│Subscriber 2β”‚   β”‚
β”‚                        β”‚ messages          β”‚  A,B,   β”‚ (all msgs) β”‚   β”‚
β”‚                        β”‚                   β”‚  C,D    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                        β”‚                   β”‚                          β”‚
β”‚                        β”‚                   β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                        β”‚                   │────────►│Subscriber 3β”‚   β”‚
β”‚                        β”‚                   β”‚  A,B,   β”‚ (all msgs) β”‚   β”‚
β”‚                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  C,D    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                         β”‚
β”‚  Use cases:                                                             β”‚
β”‚  - Event broadcast                                                      β”‚
β”‚  - Log collection (multiple systems receive same logs)                  β”‚
β”‚  - Price updates (propagate to all clients)                             β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Consumer Group (Hybrid)

Kafka style: Topic + distributed processing within group

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Consumer Group                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
β”‚                        β”‚      Topic        β”‚                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚ β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β” β”‚                          β”‚
β”‚  β”‚Publisher │─────────►│ β”‚ A β”‚ B β”‚ C β”‚ D β”‚ β”‚                          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜ β”‚                          β”‚
β”‚                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚
β”‚                                  β”‚                                     β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”‚
β”‚              β–Ό                   β–Ό                   β–Ό                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Consumer Group 1 β”‚ β”‚  Consumer Group 2 β”‚ β”‚  Consumer Group 3 β”‚    β”‚
β”‚  β”‚ (Order Service)   β”‚ β”‚ (Analytics)       β”‚ β”‚ (Notification)    β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”    β”‚ β”‚ β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”    β”‚ β”‚ β”Œβ”€β”€β”€β”€β”            β”‚    β”‚
β”‚  β”‚ β”‚C1-1β”‚ β”‚C1-2β”‚    β”‚ β”‚ β”‚C2-1β”‚ β”‚C2-2β”‚    β”‚ β”‚ β”‚C3-1β”‚            β”‚    β”‚
β”‚  β”‚ β”‚A,C β”‚ β”‚B,D β”‚    β”‚ β”‚ β”‚A,C β”‚ β”‚B,D β”‚    β”‚ β”‚ β”‚A,B,C,Dβ”‚         β”‚    β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜    β”‚ β”‚ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜    β”‚ β”‚ β””β”€β”€β”€β”€β”˜            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                         β”‚
β”‚  Behavior:                                                              β”‚
β”‚  - Each group receives all messages (Pub/Sub)                           β”‚
β”‚  - Within group, messages are distributed (Point-to-Point)              β”‚
β”‚  - Scaling: Add consumers within group                                  β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Pattern Comparison

Characteristic Queue (P2P) Topic (Pub/Sub) Consumer Group
Message copies 1:1 1:N 1 per group
Load balancing O X O within group
Broadcast X O O between groups
Scalability Add consumers Limited Flexible

4. Message Delivery Guarantees

At-Most-Once

Messages may be lost, but no duplicates.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     At-Most-Once                                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚  β”‚ Producer β”‚     β”‚  Queue  β”‚     β”‚ Consumer β”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       │── Send(msg) ──►│               β”‚                               β”‚
β”‚       β”‚                │── Deliver ───►│                               β”‚
β”‚       β”‚                β”‚               X Failure before processing!    β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       β”‚                β”‚ (delete msg)  β”‚                               β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       β”‚                β”‚ No resend     β”‚                               β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚                                                                         β”‚
β”‚  Implementation: Delete message before ACK                              β”‚
β”‚                                                                         β”‚
β”‚  Advantages:                                                            β”‚
β”‚  - No duplicate processing needed                                       β”‚
β”‚  - Fastest performance                                                  β”‚
β”‚                                                                         β”‚
β”‚  Disadvantages:                                                         β”‚
β”‚  - Possible message loss                                                β”‚
β”‚                                                                         β”‚
β”‚  Use cases:                                                             β”‚
β”‚  - Real-time sensor data (some loss acceptable)                         β”‚
β”‚  - Log collection (performance over completeness)                       β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

At-Least-Once

Messages may be duplicated, but no loss.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     At-Least-Once                                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”‚
β”‚  β”‚ Producer β”‚     β”‚  Queue  β”‚     β”‚ Consumer β”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       │── Send(msg) ──►│               β”‚                               β”‚
β”‚       β”‚                │── Deliver ───►│                               β”‚
β”‚       β”‚                β”‚               β”‚ Processing complete           β”‚
β”‚       β”‚                β”‚               X Failure before ACK!           β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       β”‚                β”‚ (no ACK recv) β”‚                               β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚       β”‚                │── Redeliver ─►│ ← Resend (duplicate!)         β”‚
β”‚       β”‚                │◄── ACK ───────│                               β”‚
β”‚       β”‚                β”‚               β”‚                               β”‚
β”‚                                                                         β”‚
β”‚  Implementation: Delete message only after ACK                          β”‚
β”‚                                                                         β”‚
β”‚  Advantages:                                                            β”‚
β”‚  - No message loss                                                      β”‚
β”‚                                                                         β”‚
β”‚  Disadvantages:                                                         β”‚
β”‚  - Need duplicate processing (requires idempotency)                     β”‚
β”‚                                                                         β”‚
β”‚  Use cases:                                                             β”‚
β”‚  - Payment processing (no loss allowed, implement idempotency)          β”‚
β”‚  - Order processing                                                     β”‚
β”‚  - Email sending                                                        β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Exactly-Once

Theoretically most ideal, but complex to implement.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Exactly-Once                                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Pure Exactly-Once is impossible in distributed systems!                β”‚
β”‚  (Two Generals Problem)                                                β”‚
β”‚                                                                         β”‚
β”‚  Practical implementation: "Effectively Once"                           β”‚
β”‚                                                                         β”‚
β”‚  Method 1: At-Least-Once + Idempotent Consumer                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚ Producer │────►│  Queue  │────►│ Idempotent       β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚ Consumer         β”‚                β”‚
β”‚                                   β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚                β”‚
β”‚                                   β”‚ β”‚Processed IDs β”‚ β”‚                β”‚
β”‚                                   β”‚ β”‚{id1, id2, ..}β”‚ β”‚                β”‚
β”‚                                   β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                β”‚
β”‚                                   β”‚ Ignore already   β”‚                β”‚
β”‚                                   β”‚ processed        β”‚                β”‚
β”‚                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                                         β”‚
β”‚  Method 2: Transaction-based (Kafka Transactions)                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚  β”‚  Transaction                                             β”‚          β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚          β”‚
β”‚  β”‚  β”‚ Read from   │──│ Process     │──│ Write to    β”‚      β”‚          β”‚
β”‚  β”‚  β”‚ input topic β”‚  β”‚             β”‚  β”‚ output topicβ”‚      β”‚          β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚          β”‚
β”‚  β”‚                                                          β”‚          β”‚
β”‚  β”‚  β†’ All succeed or all fail                               β”‚          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”‚                                                                         β”‚
β”‚  Use cases:                                                             β”‚
β”‚  - Financial transactions                                               β”‚
β”‚  - Inventory management                                                 β”‚
β”‚  - Stream processing (Kafka Streams)                                    β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Delivery Guarantee Comparison

Guarantee Level Loss Duplicate Performance Complexity
At-Most-Once Possible None Highest Low
At-Least-Once None Possible Good Medium
Exactly-Once None None Low High

5. Idempotency

What is Idempotency?

The property that performing the same operation multiple times produces the same result.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Idempotency                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Idempotent operation:                                                  β”‚
β”‚  f(f(x)) = f(x)                                                        β”‚
β”‚                                                                         β”‚
β”‚  Examples:                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Operation                β”‚ Idempotent? β”‚ Description         β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚  x = 5                    β”‚  O     β”‚ x=5 no matter how many  β”‚    β”‚
β”‚  β”‚  DELETE /users/123        β”‚  O     β”‚ Deleting already deletedβ”‚    β”‚
β”‚  β”‚  PUT /users/123 {name:A}  β”‚  O     β”‚ Overwrite with same val β”‚    β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚  β”‚  x = x + 1                β”‚  X     β”‚ Increases each time     β”‚    β”‚
β”‚  β”‚  POST /orders             β”‚  X     β”‚ Creates new order each  β”‚    β”‚
β”‚  β”‚  account.balance -= 100   β”‚  X     β”‚ Deducts each time       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Idempotency Implementation Patterns

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Idempotency Implementation Methods                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  Method 1: Idempotency Key                                             β”‚
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚  Client  β”‚                         β”‚        Server          β”‚       β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                         β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚       β”‚
β”‚       β”‚                               β”‚  β”‚ Processed Keys   β”‚  β”‚       β”‚
β”‚       │──POST /payment                β”‚  β”‚ {key1, key2, ...}β”‚  β”‚       β”‚
β”‚       β”‚  Idempotency-Key: abc123     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚       β”‚
β”‚       β”‚  {amount: 100}               β”‚                        β”‚       β”‚
β”‚       β”‚                               β”‚  1. Check: abc123?    β”‚       β”‚
β”‚       β”‚                               β”‚  2. Not found β†’ processβ”‚       β”‚
β”‚       β”‚                               β”‚  3. Store abc123      β”‚       β”‚
β”‚       │◄─ 200 OK ─────────────────────│                        β”‚       β”‚
β”‚       β”‚                               β”‚                        β”‚       β”‚
β”‚       │──POST /payment (retry)        β”‚                        β”‚       β”‚
β”‚       β”‚  Idempotency-Key: abc123     β”‚                        β”‚       β”‚
β”‚       β”‚  {amount: 100}               β”‚                        β”‚       β”‚
β”‚       β”‚                               β”‚  1. Check: abc123?    β”‚       β”‚
β”‚       β”‚                               β”‚  2. Found β†’ return old β”‚       β”‚
β”‚       │◄─ 200 OK (same response) ─────│                        β”‚       β”‚
β”‚       β”‚                               β”‚                        β”‚       β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Method 2: Version/Conditional Update                                  β”‚
β”‚                                                                         β”‚
β”‚  -- Non-idempotent UPDATE                                               β”‚
β”‚  UPDATE accounts SET balance = balance - 100 WHERE id = 1;             β”‚
β”‚  -- Deducts 100 each execution                                          β”‚
β”‚                                                                         β”‚
β”‚  -- Idempotent UPDATE (using version)                                  β”‚
β”‚  UPDATE accounts                                                        β”‚
β”‚  SET balance = balance - 100, version = 2                               β”‚
β”‚  WHERE id = 1 AND version = 1;                                         β”‚
β”‚  -- Only executes when version = 1 (succeeds only once)                 β”‚
β”‚                                                                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Method 3: Absolute Value Setting                                      β”‚
β”‚                                                                         β”‚
β”‚  -- Non-idempotent                                                      β”‚
β”‚  INSERT INTO orders (user_id, amount) VALUES (1, 100);                 β”‚
β”‚                                                                         β”‚
β”‚  -- Idempotent (UPSERT)                                                β”‚
β”‚  INSERT INTO orders (order_id, user_id, amount)                        β”‚
β”‚  VALUES ('order-abc123', 1, 100)                                       β”‚
β”‚  ON CONFLICT (order_id) DO NOTHING;                                    β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Idempotent Consumer Implementation Example

class IdempotentConsumer:
    def __init__(self, redis_client, db):
        self.redis = redis_client
        self.db = db

    def process_message(self, message):
        message_id = message['id']

        # 1. Check if already processed
        if self.is_processed(message_id):
            print(f"Message {message_id} already processed, skipping")
            return

        # 2. Process business logic
        try:
            self.handle_business_logic(message)

            # 3. Mark as processed (atomically)
            self.mark_processed(message_id)

        except Exception as e:
            # Can retry on processing failure
            raise

    def is_processed(self, message_id):
        # Use Redis SET (manage memory with TTL)
        return self.redis.sismember("processed_messages", message_id)

    def mark_processed(self, message_id):
        # Auto-delete after 24 hours
        self.redis.sadd("processed_messages", message_id)
        self.redis.expire("processed_messages", 86400)

    def handle_business_logic(self, message):
        # Actual business logic
        if message['type'] == 'payment':
            self.process_payment(message['data'])

6. Message Queue Patterns

Work Queue (Task Queue)

Distribute tasks to multiple workers.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Work Queue Pattern                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                              β”‚
β”‚                       β”‚   Work Queue    β”‚                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚ β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”   β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚  β”‚ Producer │───────►│ β”‚T1 β”‚T2 β”‚T3 β”‚   │────────►│ Worker 1 β”‚         β”‚
β”‚  β”‚  (Web)   β”‚        β”‚ β”œβ”€β”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€   β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚ β”‚T4 β”‚T5 β”‚T6 β”‚   β”‚                              β”‚
β”‚                       β”‚ β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜   β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”€β”€β”€β”€β”€β”€β”€β”€β–Ίβ”‚ Worker 2 β”‚         β”‚
β”‚                                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚  Use cases:                                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚  - Image resizing                           ─────►│ Worker 3 β”‚         β”‚
β”‚  - PDF generation                                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚  - Email sending                                                        β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Request-Reply

Asynchronous request-response pattern.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Request-Reply Pattern                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚
β”‚  β”‚ Requesterβ”‚     β”‚Request Queueβ”‚     β”‚ Replier  β”‚                    β”‚
β”‚  β”‚          β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚          β”‚                    β”‚
β”‚  β”‚          β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚          β”‚                    β”‚
β”‚  β”‚          β”‚     β”‚Reply Queue  β”‚     β”‚          β”‚                    β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                    β”‚
β”‚       β”‚                  β”‚                 β”‚                           β”‚
β”‚       │─Request(replyTo:Q1,correlationId:C1)─►│                        β”‚
β”‚       β”‚                  β”‚                 β”‚                           β”‚
β”‚       β”‚                  β”‚                 β”‚ Processing                β”‚
β”‚       β”‚                  β”‚                 β”‚                           β”‚
β”‚       │◄──Reply(correlationId:C1)──────────│                           β”‚
β”‚       β”‚                  β”‚                 β”‚                           β”‚
β”‚                                                                         β”‚
β”‚  Message structure:                                                     β”‚
β”‚  Request: {                                                             β”‚
β”‚    correlationId: "req-123",                                           β”‚
β”‚    replyTo: "reply-queue-A",                                           β”‚
β”‚    body: { ... }                                                       β”‚
β”‚  }                                                                      β”‚
β”‚                                                                         β”‚
β”‚  Reply: {                                                               β”‚
β”‚    correlationId: "req-123",  // Match request and reply               β”‚
β”‚    body: { ... }                                                       β”‚
β”‚  }                                                                      β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Dead Letter Queue (DLQ)

Store failed messages.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Dead Letter Queue                                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚   Main Queue    β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚  β”‚ Producer │───────►│ β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”   │────────►│ Consumer β”‚         β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚ β”‚ A β”‚ B β”‚ C β”‚   β”‚         β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β”‚
β”‚                       β”‚ β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜   β”‚              β”‚                β”‚
β”‚                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚                β”‚
β”‚                                β”‚                       β”‚                β”‚
β”‚                                β”‚ Processing failed     β”‚                β”‚
β”‚                                β”‚ (retry exceeded)      β”‚                β”‚
β”‚                                β–Ό                       β–Ό                β”‚
β”‚                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        Failed! (msg B)        β”‚
β”‚                       β”‚ Dead Letter Q   β”‚              β”‚                β”‚
β”‚                       β”‚ β”Œβ”€β”€β”€β”           β”‚β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                       β”‚ β”‚ B β”‚           β”‚                               β”‚
β”‚                       β”‚ β””β”€β”€β”€β”˜           β”‚                               β”‚
β”‚                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β”‚                                β”‚                                        β”‚
β”‚                                β–Ό                                        β”‚
β”‚                       Manual review / reprocess                         β”‚
β”‚                                                                         β”‚
β”‚  DLQ usage:                                                             β”‚
β”‚  - Analyze failure cause                                                β”‚
β”‚  - Manual reprocessing                                                  β”‚
β”‚  - Alerting/monitoring                                                  β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Priority Queue

Process messages according to priority.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Priority Queue                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
β”‚  β”‚ Producer β”‚     β”‚   Priority Queue    β”‚     β”‚ Consumer β”‚            β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β”‚                     β”‚     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜            β”‚
β”‚       β”‚           β”‚ High   β”Œβ”€β”€β”€β”¬β”€β”€β”€β”    β”‚          β”‚                  β”‚
β”‚       │──(P:High)─│───────►│ A β”‚ D β”‚    │──────────│                  β”‚
β”‚       β”‚           β”‚        β””β”€β”€β”€β”΄β”€β”€β”€β”˜    β”‚          β”‚                  β”‚
β”‚       │──(P:Med)──│ Medium β”Œβ”€β”€β”€β”¬β”€β”€β”€β”    β”‚          β”‚                  β”‚
β”‚       β”‚           │───────►│ B β”‚   β”‚    β”‚          β”‚                  β”‚
β”‚       β”‚           β”‚        β””β”€β”€β”€β”΄β”€β”€β”€β”˜    β”‚          β”‚                  β”‚
β”‚       │──(P:Low)──│ Low    β”Œβ”€β”€β”€β”¬β”€β”€β”€β”    β”‚          β”‚                  β”‚
β”‚       β”‚           │───────►│ C β”‚ E β”‚    β”‚          β”‚                  β”‚
β”‚       β”‚           β”‚        β””β”€β”€β”€β”΄β”€β”€β”€β”˜    β”‚          β”‚                  β”‚
β”‚       β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚                  β”‚
β”‚       β”‚                                            β”‚                  β”‚
β”‚       β”‚           Processing order: A β†’ D β†’ B β†’ C β†’ E β”‚                  β”‚
β”‚                                                                         β”‚
β”‚  Implementation methods:                                                β”‚
β”‚  1. Separate queues per priority + weighted polling                    β”‚
β”‚  2. Single queue + heap sort                                            β”‚
β”‚  3. RabbitMQ: x-max-priority setting                                   β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7. Practice Problems

Exercise 1: Choose Communication Method

Select appropriate synchronous/asynchronous method for the following scenarios:

  1. User login authentication
  2. Send confirmation email after order
  3. Payment approval request
  4. Log collection
  5. Real-time chat message

Exercise 2: Choose Delivery Guarantee

Select appropriate delivery guarantee level for the following use cases:

  1. IoT sensor temperature data
  2. Bank transfer request
  3. News feed update
  4. Order creation event
  5. Game player position update

Exercise 3: Design Idempotency

Design how to make the following operations idempotent:

  1. Withdraw 100 from account
  2. Decrease product inventory by 1
  3. Send email
  4. Add points

Next Steps

In 12_Message_System_Comparison.md, let's compare major message systems like Kafka, RabbitMQ, AWS SQS/SNS!


References

  • "Enterprise Integration Patterns" - Gregor Hohpe, Bobby Woolf
  • RabbitMQ Official Documentation
  • Apache Kafka Documentation
  • AWS Messaging Services
  • "Designing Data-Intensive Applications" - Martin Kleppmann
to navigate between lessons