blog.dopana

Back

Xây dựng một ứng dụng trò chuyện thời gian thực (Real-time Chat App) cho hàng triệu người dùng toàn cầu luôn là bài toán hóc chuẩn trong System Design. Với kiến trúc serverless truyền thống như AWS Lambda hay GCP Cloud Functions, việc duy trì kết nối WebSocket lâu dài (long-lived stateful connections) thường rất đắt đỏ hoặc phức tạp vì các hàm serverless vốn có bản chất ngắn hạn (stateless).

Tuy nhiên, với hệ sinh thái Cloudflare Edge Platform, bài toán này được giải quyết triệt me và thanh thoát nhờ sự kết hợp giữa Cloudflare Workers, Durable Objects, Cloudflare KV, và D1 Database.

1. Bài toán: Tại sao Chat App lại khó trên Serverless?#

Hãy tưởng tượng serverless như một quán ăn fast-food: nhân viên (Function) nhận order, làm đồ ăn xong rồi giải tán. Họ không ở lại bàn ăn để nói chuyện với khách cả buổi.

  • WebSocket Connection State: WebSockets đòi hỏi kết nối hai chiều liên tục giữa Client và Server. Serverless thông thường ngắt kết nối ngay khi response kết thúc.
  • Message Routing & Broadcast: Khi User A gửi tin nhắn trong Phòng 101, làm sao server gửi tin nhắn đó tới đúng User B và User C đang ở các máy chủ edge khác nhau?
  • Persistence & History: Lưu trữ lịch sử tin nhắn với độ trễ thấp và chi phí tối ưu.

2. Kiến trúc tổng quan (Architecture Overview)#

Hệ thống của chúng ta tận dụng 4 thành phần cốt lõi của Cloudflare:

  1. Cloudflare Workers (Edge Gateway): Xử lý HTTP request và bắt đầu bắt tay WebSocket (Handshake) tại Pop (Point of Presence) gần người dùng nhất.
  2. Durable Objects (DO - Room Controller): Thành phần quan trọng nhất! DO đóng vai trò như một Singleton Actor trên Edge, duy trì kết nối WebSocket và broadcast tin nhắn trong từng phòng chat.
  3. Cloudflare D1 (SQLite Database): Lưu trữ thông tin người dùng, danh sách phòng, và lịch sử tin nhắn vĩnh viễn.
  4. Cloudflare KV (Key-Value Store): Caching session authentication và cấu hình với độ trễ siêu thấp.

3. Chi tiết triển khai Code (Implementation Details)#

3.1. Durable Object: Quản lý WebSocket Room State#

Mỗi phòng chat (Chat Room) sẽ là một instance của Durable Object. DO đảm bảo tất cả kết nối WebSocket của một phòng được điều hướng về đúng một Coordinator Node.

[!NOTE] Durable Objects cho phép lưu trữ In-Memory State an toàn nhờ cơ chế Single-threaded Actor Model, loại bỏ hoàn toàn rủi ro Race Condition khi broadcast tin nhắn.

3.2. Worker Gateway: Điều hướng kết nối#

Worker đóng vai trò làm API Gateway kiểm tra Token và routed request đến đúng Durable Object theo roomId.

4. Ưu điểm & Điểm lưu ý (Trade-offs)#

[!TIP] Ưu điểm:

  • Zero Cold Starts: Chạy trực tiếp tại Edge (V8 Isolates).
  • Global Low Latency: Người dùng ở Việt Nam hay Mỹ đều kết nối tới Pop gần nhất.
  • Auto Scale: Tự động mở rộng theo phòng chat mà không lo server hết RAM/CPU.

[!WARNING] Giới hạn:

  • Durable Object Limits: Mỗi DO là một single-thread instance. Nếu một phòng chat có >10.000 người gửi tin cùng lúc, ta cần dùng mô hình DO Tree/Hierarchy để scale out.

5. Tài liệu tham khảo#