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.