πThe Interview Question
"Design a real-time chat application like WhatsApp or Facebook Messenger"
πStep 1: Requirements
Functional
Non-Functional
Scale
πStep 2: High-Level Architecture
System Architecture
Live
Mobile App
WebSocket Servers
Scalable
Message Service
Presence Service
Message Store
Cassandra
β‘ High Availabilityπ Auto-scalingπ‘οΈ Fault Tolerant
πStep 3: WebSocket Connection
Why WebSocket?
Connection Flow
@ServerEndpoint("/chat")public class ChatEndpoint { private static Map<String, Session> sessions = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session) { String userId = authenticate(session); sessions.put(userId, session); presenceService.setOnline(userId, getServerId()); } @OnMessage public void onMessage(String message, Session session) { ChatMessage msg = parse(message); messageService.send(msg); } @OnClose public void onClose(Session session) { String userId = getUser(session); sessions.remove(userId); presenceService.setOffline(userId); }}πStep 4: Message Delivery
Sending a Message
1. User A sends message to User B2. WebSocket server receives message3. Store in database (Cassandra)4. Lookup User B's WebSocket server5. Route message to that server6. Deliver to User B7. Send "delivered" receipt to User AMessage States
πStep 5: Database Design
Messages Table (Cassandra)
CREATE TABLE messages ( chat_id UUID, message_id TIMEUUID, sender_id BIGINT, content TEXT, media_url TEXT, status TEXT, created_at TIMESTAMP, PRIMARY KEY (chat_id, message_id)) WITH CLUSTERING ORDER BY (message_id DESC);Why Cassandra?
πStep 6: Group Chat
Challenge
Solution: Fan-out on read
// Message stored onceINSERT INTO group_messages (group_id, message_id, content, sender)// Each member queries their groupsSELECT * FROM group_messages WHERE group_id IN (user's groups)ORDER BY message_id DESCπStep 7: Presence (Online Status)
Using Redis
// Set online with TTLSET user:123:online "server-1" EX 30// Heartbeat every 25 seconds to refreshEXPIRE user:123:online 30// Check if onlineEXISTS user:123:onlineπStep 8: Media Handling
1. Client uploads to CDN2. Get CDN URL3. Send message with media_url4. Recipient downloads from CDNπScaling Strategies
WebSocket Servers
Message Routing
πInterview Tips
This is asked at Facebook, WhatsApp, and startups. Our course includes building a working chat system.