📌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.