0
0
HLDsystem_design~25 mins

Message queue concept in HLD - System Design Exercise

Choose your learning style9 modes available
Design: Message Queue System
Design the core message queue system including producers, consumers, queue storage, and delivery mechanisms. Out of scope: detailed UI, security/authentication, and complex routing features.
Functional Requirements
FR1: Allow multiple producers to send messages asynchronously
FR2: Allow multiple consumers to receive and process messages
FR3: Ensure messages are delivered at least once
FR4: Support message ordering within a queue
FR5: Handle message persistence to avoid data loss
FR6: Support message acknowledgment from consumers
FR7: Allow scaling to handle 10,000 messages per second
FR8: Provide low latency with p99 latency under 100ms for message delivery
Non-Functional Requirements
NFR1: System must be highly available with 99.9% uptime
NFR2: Messages must not be lost even if a consumer or producer crashes
NFR3: Support horizontal scaling for producers and consumers
NFR4: Latency target: p99 < 100ms for message delivery
NFR5: Throughput target: 10,000 messages per second
Think Before You Design
Questions to Ask
❓ Question 1
❓ Question 2
❓ Question 3
❓ Question 4
❓ Question 5
Key Components
Producers to send messages
Consumers to receive messages
Message queue storage (in-memory or persistent)
Message broker to manage queues and delivery
Acknowledgment and retry mechanism
Load balancer or API gateway for producers and consumers
Design Patterns
Publish-Subscribe pattern
Work Queue pattern
At-least-once delivery with acknowledgments
Message persistence and durability
Horizontal scaling with partitioned queues
Reference Architecture
  +------------+       +--------------+       +------------+
  |  Producer  | ----> | Message Queue| ----> |  Consumer  |
  +------------+       |   Broker     |       +------------+
                       | (Persistent) |
                       +--------------+
                             ^  |
                             |  v
                      +----------------+
                      |  Message Store  |
                      +----------------+
Components
Producer
Any client application or service
Send messages asynchronously to the message queue broker
Message Queue Broker
Custom or open-source broker (e.g., RabbitMQ, Kafka)
Manage queues, store messages persistently, and deliver messages to consumers
Message Store
Durable storage like disk-based database or log storage
Persist messages to prevent data loss on failures
Consumer
Client applications or services
Receive messages from the broker and process them
Acknowledgment Mechanism
Broker feature
Ensure messages are processed and allow retries if needed
Request Flow
1. Producer sends a message to the message queue broker asynchronously.
2. Broker stores the message persistently in the message store.
3. Broker places the message in the appropriate queue.
4. Consumer subscribes to the queue and receives messages.
5. Consumer processes the message and sends acknowledgment to the broker.
6. Broker marks the message as processed and removes it from the queue.
7. If acknowledgment is not received within timeout, broker retries delivery.
Database Schema
Entities: - Message: id (PK), payload, timestamp, status (pending, delivered, acknowledged), queue_id - Queue: id (PK), name, created_at - Consumer: id (PK), name, subscription details Relationships: - Each Message belongs to one Queue (1:N Queue to Message) - Consumers subscribe to Queues (N:N with subscription table)
Scaling Discussion
Bottlenecks
Message broker CPU and memory limits under high throughput
Disk I/O bottleneck for message persistence
Network bandwidth limits between producers, broker, and consumers
Single queue becoming a hotspot causing uneven load
Consumer processing speed limiting message consumption
Solutions
Partition queues to distribute load across multiple broker instances
Use fast persistent storage like SSDs or distributed log storage
Implement load balancing for producers and consumers
Scale consumers horizontally to increase processing capacity
Use batching and compression to reduce network overhead
Interview Tips
Time: Spend 10 minutes clarifying requirements and constraints, 20 minutes designing the architecture and data flow, 10 minutes discussing scaling and trade-offs, and 5 minutes summarizing.
Explain asynchronous communication benefits and use cases
Discuss message durability and acknowledgment for reliability
Describe how to handle ordering and retries
Highlight scaling strategies like partitioning and horizontal scaling
Mention trade-offs between latency, throughput, and consistency