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