CodeReady
Quay lại danh sách case study

Xây dựng hệ thống Real-time Collaboration với WebSockets quy mô lớn

Thiết kế hệ thống chỉnh sửa tài liệu thời gian thực cho phép hàng trăm nghìn người dùng kết nối đồng thời.

Bối cảnh

Sản phẩm công nghệ giáo dục cần tính năng bảng trắng và soạn thảo văn bản đồng thời cho hàng chục ngàn lớp học trực tuyến.

Vấn đề cần xử lý

Server Node.js đơn lẻ không thể duy trì hàng trăm ngàn kết nối WebSocket đồng thời do giới hạn file descriptor và bộ nhớ RAM cho mỗi socket.

Hướng xử lý đề xuất

Xây dựng cụm WebSocket Server phân tán kết hợp với Redis Pub/Sub làm lớp trung chuyển thông điệp giữa các node, đồng thời sử dụng thuật toán CRDT (Conflict-free Replicated Data Type) để đồng bộ dữ liệu văn bản.

Câu trả lời mẫu khi phỏng vấn

Để giải quyết bài toán real-time scale lớn, tôi thiết kế kiến trúc phân tán sử dụng Socket.io kết hợp với Redis Adapter để đồng bộ sự kiện giữa các cụm server khác nhau. Về mặt bài toán đồng bộ dữ liệu văn bản giữa nhiều người dùng, chúng tôi áp dụng thuật toán CRDT thay vì Operational Transformation vì tính phi tập trung và dễ cài đặt trên JavaScript. Đồng thời, tinh chỉnh hệ điều hành Linux để tăng giới hạn file descriptors cho phép.

Trade-off

Sử dụng CRDT làm tăng nhẹ kích thước payload truyền tải qua mạng nhưng đổi lại trải nghiệm mượt mà không có độ trễ nhận diện cho người dùng cuối.

Kết quả kỳ vọng

Hệ thống hỗ trợ mượt mà hơn 200.000 kết nối đồng thời với độ trễ dưới 50ms trên toàn cầu.

Bài học khi trả lời phỏng vấn

Đồng bộ trạng thái phân tán trong thời gian thực bắt buộc phải giải quyết bài toán xung đột dữ liệu từ gốc bằng các mô hình toán học như CRDT.