Skip to main content

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

  1. Real-time: WebSocket connections (persistent)
  2. Message ordering: Guarantee FIFO per conversation
  3. Offline users: Store messages until online
  4. 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.