- Trang web thử nghiệm One Million Chessboards cung cấp một triệu bàn cờ mà ai cũng có thể thao tác đồng thời
- Khi một người di chuyển quân cờ, thay đổi sẽ được phản ánh theo thời gian thực tới tất cả người dùng, và cũng có thể tự do di chuyển giữa các bàn mà không có lượt
- Toàn bộ trạng thái bàn cờ được lưu dưới dạng mảng bộ nhớ 2 chiều gồm 64 triệu
uint64, và chỉ có duy nhất một máy chủ
- Đây là dự án đầu tiên được viết bằng Go, và việc đồng bộ được thực hiện bằng thông điệp Protobuf nén zstd dựa trên WebSocket
- Đây là một dự án đầy thách thức về mặt kỹ thuật, đến mức riêng phần hiện thực logic phía client theo kiểu áp dụng lạc quan + rollback đã mất một tuần
One Million Chessboards
- One Million Chessboards cung cấp một triệu bàn cờ, và bất kỳ ai cũng có thể đồng thời di chuyển quân cờ
- Đây không phải hệ thống theo lượt; khi một người di chuyển quân cờ, thay đổi sẽ lập tức phản ánh tới tất cả người dùng
- Việc di chuyển giữa các bàn cũng hoàn toàn tự do, mang lại một trải nghiệm chưa từng có
Bối cảnh
- Đây là tác phẩm thử nghiệm tiếp nối dự án One Million Checkboxes trước đó, với mục tiêu hướng tới quy mô lớn hơn và các thách thức khó hơn
- Tác giả đã đầu tư rất nhiều thời gian cho dự án này và mong mọi người sẽ thích thú khi trải nghiệm
Cách triển khai kỹ thuật
- Đây là một trong những công việc thách thức về mặt kỹ thuật nhất mà tác giả từng thực hiện gần đây
- Tổng quan kỹ thuật chính:
- Thiết kế có tính đến khả năng mở rộng
- Chạy trên một máy chủ duy nhất
- Toàn bộ bàn cờ được cấu thành bằng mảng
uint64 2 chiều trong bộ nhớ (tổng cộng 64 triệu ô)
- Backend viết bằng Go, cũng là dự án Go đầu tiên của tác giả
- Một luồng writer duy nhất + nhiều luồng reader, kiểm soát truy cập bằng mutex
- Client áp dụng cập nhật lạc quan, và khi nhận được cập nhật xung đột từ máy chủ thì sẽ rollback
- Thông điệp protobuf nén zstd được gửi tới client qua WebSocket
- Client được chia thành các vùng 50x50, chỉ nhận các nước đi ở những vùng lân cận
- Dữ liệu toàn cục (thống kê, minimap, v.v.) được polling bằng HTTP GET, tận dụng cache của Cloudflare
Cốt lõi trong cách client hoạt động
- Cách áp dụng lạc quan + rollback (optimistic update with rollback) gồm khoảng 1.600 dòng mã, được phát triển trong 7 ngày tập trung
> “Đây là vấn đề mà gần đây tôi đã phải vật lộn vất vả nhất”
Phản ứng sau khi ra mắt
- Chỉ sau 8 giờ ra mắt đã ghi nhận hơn 1,3 triệu lượt di chuyển quân cờ, với khoảng 400 người dùng đồng thời
- Tải trên máy chủ thấp đến mức có thể xem như không đáng kể
Thống kê hiện tại
- Số người chơi đang online: 199.276
- Tổng số lượt di chuyển: 5.238.978
- Tổng số quân cờ: 1.490.061.914
- Số lượng vua: 9.035.389
3 bình luận
Giá mà họ thu nhỏ kích thước lại một chút thì tốt biết mấy... xác suất gặp được ai đó quá thấp haha hu hu
Tôi đã thử rồi, và thấy khá thú vị ở chỗ hiện tại có thể đi ra ngoài bàn hiện tại rồi chuyển sang bàn cờ bên dưới theo góc nhìn của bên đen.
Ý kiến trên Hacker News
Xin chào! Tôi là người làm ra cái này. Xin lỗi vì phần giải thích trên blog còn thiếu. Nếu có câu hỏi về kiến trúc, tôi rất vui được trả lời. Tôi đã tập trung vào việc làm cho dự án này có thể xử lý hàng nghìn client đồng thời chỉ với một tiến trình. Golang rất phù hợp cho việc này
Trò này đã trở nên thú vị. Ví dụ, mọi người đã phát hiện ra rằng một bàn cờ đơn được lấp kín phần rìa ngoài với độ sâu hai ô là bất khả chiến bại. Thật thích khi thấy lối chơi emergent. Đó là sự thiên tài trong dự án của eieio. Bề ngoài có vẻ đơn giản, nhưng ở quy mô lớn lại dẫn đến những khả năng thú vị
Có người đã chặn vua bằng khoảng 40 con xe. Tôi chui vào bằng mã, thì ngay lập tức bị vua bắt, rồi họ dùng một con xe khác bịt lại chỗ hở. Vui phết
Có thể di chuyển giữa các bàn cờ nhưng không thể bắt quân. Điểm lạ là không phải nước đi không được chiếu sang. Ví dụ, đường màu xanh của hậu chỉ chính xác qua ranh giới bàn cờ, nhưng lại dừng ở mọi quân cờ trên bàn khác. Làm rất tốt như một bài tập về quy mô
Tôi gặp lỗi. Uncaught TypeError: không thể đọc thuộc tính của null
Tôi cứ tưởng mỗi bàn cờ sẽ có "lượt" riêng. Không ngờ tôi có thể chọn ngẫu nhiên một bàn cờ, giải phóng hậu đen, rồi dọn sạch toàn bộ quân trắng trong khi đối thủ không thể làm gì
Có kẻ gian chơi bằng màu còn lại. Hôm qua tôi có cảm giác vậy rồi, nhưng hôm nay thì chắc chắn thấy. Có vẻ nó được dùng để trả đũa. Ngay khi pháo đài đen bị phá hủy, các quân của pháo đài trắng gần nhất liền di chuyển vào những vị trí tệ nhất có thể
Tôi đoán chuyện này sẽ phát triển thành chiến tranh bot. Ví dụ, có những đoạn mã để đẩy tốt lên
Rượt theo người khác rất vui. Kể cả không phải vì cờ vua thì vẫn vui
Chạy tốt trên Firefox trên điện thoại Android. Làm tốt lắm