Thiết kế hệ thống Chat thời gian thực 1-1 và Group Chat: Kiến trúc Socket và Message Broker
Thử thách kết nối 1 triệu người dùng đồng thời Xây dựng một ứng dụng chat như Telegram, Zalo hay Slack đòi hỏi phải giải quyết cùng lúc nhiều bài toán hóc búa: - Duy trì hàng trăm ngàn kết nối WebSoc…
☰ Mục lục bài viết (7 phần) Mở / Đóng mục lục
Thử thách kết nối 1 triệu người dùng đồng thời#
Xây dựng một ứng dụng chat như Telegram, Zalo hay Slack đòi hỏi phải giải quyết cùng lúc nhiều bài toán hóc búa:
- Duy trì hàng trăm ngàn kết nối WebSocket thường trực mà không tốn quá nhiều RAM.
- Chuyển tiếp tin nhắn tức thì giữa 2 người dùng đang kết nối vào 2 máy chủ WebSocket khác nhau.
- Hỗ trợ xem lại lịch sử tin nhắn khi ngoại tuyến (Offline Message Sync).
Dưới đây là sơ đồ kiến trúc chuẩn của một hệ thống Chat thời gian thực quy mô lớn.
Sơ đồ Kiến trúc phân tán cho WebSocket#
User A (Socket Server 1) User B (Socket Server 2)
│ ▲
▼ │
[ WebSocket Gateway 1 ] [ WebSocket Gateway 2 ]
│ ▲
▼ │
└───► [ Redis Pub/Sub / RabbitMQ Exchange ] ┘
3 Thành phần kiến trúc cốt lõi#
1. Tầng Gateway WebSocket phân tán#
Khi User A gửi tin nhắn cho User B, User A kết nối vào Gateway 1, nhưng User B lại đang giữ kết nối tại Gateway 2.
- Giải pháp: Sử dụng Redis Pub/Sub hoặc RabbitMQ Fanout Exchange làm kênh trung chuyển giữa các Gateway.
- Khi Gateway 1 nhận tin nhắn gửi tới User B, nó phát tin nhắn lên channel
user:B. Gateway 2 đang lắng nghe channel này sẽ lập tức nhận được và đẩy tin nhắn xuống socket của User B!
2. Quản lý trạng thái Online/Offline (Presence System)#
Lưu trạng thái hoạt động của người dùng trong Redis Key-Value với cơ chế Heartbeat (Ping/Pong) mỗi 30 giây:
// Cập nhật trạng thái sống mỗi khi client ping
await redis.set(`presence:${userId}`, 'ONLINE', 'EX', 60);
3. Lưu trữ tin nhắn: Cassandra / ScyllaDB vs PostgreSQL#
- Tin nhắn chat là dữ liệu chỉ ghi nối tiếp (Write-heavy) với dung lượng khổng lồ.
- Các công cụ như ScyllaDB hoặc Apache Cassandra với mô hình lưu trữ LSM-Tree là lựa chọn số 1 vì tốc độ ghi cực nhanh và khả năng mở rộng ngang không giới hạn.
Góc thảo luận#
Hệ thống chat của bạn đang dùng Socket.io, WebSocket native, hay các giải pháp Cloud như Firebase / Pusher?
Xem thêm nội dung liên quan:
Thảo luận
1 phản hồi
Tham gia thảo luận
Bài liên quan trong #Backend & Microservices
-
Áp dụng Model Context Protocol (MCP) của Anthropic để kết nối AI với Postgres và Docker
Hoàng Nam (Tech Lead) · 💬 1 -
So sánh mô hình Embedding đa ngữ: OpenAI text-embedding-3 vs BGE-M3 vs Cohere
Minh Trí (AI Engineer) · 💬 1 -
Xây dựng Voice AI Agent thời gian thực với WebRTC và Whisper Live: Độ trễ dưới 500ms
Lan Anh (Senior Frontend) · 💬 1 -
Cấu hình Rate Limiting ở tầng Nginx và API Gateway: Chống DDOS Layer 7 hiệu quả
Đức Huy (DevOps Specialist) · 💬 1 -
Tokenization tiếng Việt của các LLM: Tại sao chi phí tiếng Việt đắt gấp 3 lần tiếng Anh?
Minh Trí (AI Engineer) · 💬 1