Requirements: real-time messaging, online/offline status, message history, 1-1 và group chat.
- Connection layer: WebSocket là lựa chọn tốt hơn long polling vì bi-directional, persistent connection, low latency – mỗi client maintain một WebSocket connection đến chat server.
- Cross-server routing: users kết nối đến different servers – cần pub/sub layer (Redis Pub/Sub hoặc Kafka): Server A nhận message cho User B đang connect đến Server B → publish lên Redis → Server B subscribe và push đến User B.
- Message storage: Cassandra (HBase ở Facebook Messenger, Cassandra ở Discord) vì write-heavy, time-based access pattern. Schema: partition key là
(conversation_id), clustering key là(timestamp, message_id). - Offline messages: nếu user offline khi nhận message, lưu vào DB; khi reconnect, fetch unread messages.
- Status service: heart-beat mỗi 5s để track online status, lưu trong Redis với TTL.
- Fanout cho group chat: fanout-on-write (push đến tất cả members) vs fanout-on-read (members pull khi cần); với group lớn, fanout-on-write tốn kém → giới hạn group size hoặc hybrid approach.