Yêu cầu: gửi/nhận tin nhắn gần tức thời, hỗ trợ 1-1 và nhóm, hiển thị online/typing/đã đọc, lưu lịch sử, giao tin cả khi người nhận offline.
Hướng thiết kế:
- Kết nối real-time: WebSocket (song công) giữa client và chat/gateway server để đẩy tin ngay; fallback long polling. Kết nối là stateful → cần bảng ánh xạ user → server/connection (session registry) để định tuyến.
- Gửi tin: client → server nhận → ghi bền vào DB (message store, thường NoSQL wide-column cho ghi lớn, phân vùng theo conversation) → đẩy tới người nhận nếu online, nếu offline thì lưu để push notification và đồng bộ khi họ online lại.
- Định tuyến giữa nhiều server: người gửi và người nhận thường ở server khác nhau → dùng message queue/pub-sub nội bộ để chuyển tin giữa các node.
- Đảm bảo: message id + thứ tự trong hội thoại, at-least-once + idempotent để không mất/không trùng, "đã gửi/đã nhận/đã đọc" bằng ack.
- Mở rộng: nhiều gateway server sau load balancer, presence service (Redis) cho online/typing, media qua object storage + CDN.