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.
Requirements: real-time messaging, online/offline presence, message history, 1-on-1 and group chat.
- Connection layer: WebSockets are preferred over long polling — bidirectional, persistent connection, low latency; each client maintains one WebSocket connection to a chat server.
- Cross-server routing: users connect to different servers — a pub/sub layer (Redis Pub/Sub or Kafka) is needed: Server A receives a message for User B (connected to Server B) → publishes to Redis → Server B subscribes and pushes the message to User B.
- Message storage: Cassandra (Facebook Messenger uses HBase, Discord uses Cassandra) — write-heavy, time-based access patterns. Schema: partition key is
(conversation_id), clustering key is(timestamp, message_id). - Offline messages: if the user is offline, store the message in the DB; fetch unread messages on reconnect.
- Presence service: heartbeat every 5s to track online status, stored in Redis with TTL.
- Group chat fanout: fanout-on-write (push to all members immediately) vs fanout-on-read (members pull when needed); for large groups, fanout-on-write is expensive → enforce a group size limit or use a hybrid approach.