Connection: Persistent WebSocket connections. Each user maintains a connection to a Chat Server.
Message flow: User A sends → Chat Server A → Message Queue → Chat Server B → User B receives.
Offline users: Messages stored in DB. Delivered when user reconnects.
Group chat: Fan out to all group members. For large groups, use pub/sub.
Storage: Message DB (Cassandra for write throughput), User DB (PostgreSQL), Media (S3).