Design WhatsApp
Problem
Design real-time messaging app like WhatsApp.
Requirements
- One-on-one chat
- Group chat (max 256 members)
- Message delivery status (sent, delivered, read)
- End-to-end encryption
- Scale: 2B users, 100B messages/day
Key Challenges
- Real-time: WebSocket connections (persistent)
- Message ordering: Guarantee FIFO per conversation
- Offline users: Store messages until online
- Scale: Billions of messages/day
High-Level Design
Message Flow
Data Model
-- Messages (Cassandra)
CREATE TABLE messages (
conversation_id UUID,
message_id TIMEUUID,
sender_id BIGINT,
content TEXT,
created_at TIMESTAMP,
PRIMARY KEY (conversation_id, message_id)
) WITH CLUSTERING ORDER BY (message_id DESC);
Why Cassandra?
- High write throughput (100B messages/day)
- Partition by conversation_id (efficient queries)
Delivery Status
Sent: Message stored in DB
Delivered: Recipient's device received message
Read: Recipient opened chat
Implementation: Ack messages via WebSocket
End-to-End Encryption
- Signal Protocol (WhatsApp uses this)
- Encrypt on sender device, decrypt on recipient device
- Server can't read messages (zero-knowledge)
Group Chat
- Fanout: Send message to all members (up to 256)
- Optimization: Send once to each server (if multiple members on same server)
Next: Design Google Drive.