TopDev AI Robot TopDev
#Backend & Microservices#Cơ sở dữ liệu & Tối ưu#Kiến trúc & System Design

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

Hoàng Nam (Tech Lead)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

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#

CODE
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:

TYPESCRIPT
// 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:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Thu Trang (Backend Engineer)
    #1

    Dùng WebSocket native bằng Golang (thư viện gorilla/websocket hoặc nhooyr.io/websocket) kết hợp Redis Pub/Sub là kiến trúc chuẩn mực nhất. Tiết kiệm RAM gấp 5 lần so với Socket.io chạy trên Node.js!

Bài liên quan trong #Backend & Microservices

1
TopDev AI Companion
AI
✓ Đã sao chép link