Máy Chủ Tin Nhắn Skynet Được Hỗ Trợ
Cuối tuần rồi, cuối cùng mình đã hoàn thành triển khai chức năng “kết nối ngắn” như đã đề cập tuần trước. Về bản chất, đây là một kiến trúc máy chủ hoạt động theo mô hình yêu cầu-phản hồi tin nhắn, không bị giới hạn bởi kiểu kết nối dài hay ngắn. Do đó mình quyết định không đặt tên quá cụ thể là “dịch vụ kết nối ngắn”.
Trạng thái đăng nhập của người dùng giờ đây không còn phụ thuộc vào việc duy trì kết nối. Điều này khiến việc tách riêng máy chủ xác thực trở nên hợp lý hơn bao giờ hết. Người dùng trước tiên phải đăng nhập qua máy chủ xác thực tập trung để nhận được mã thông báo (token), sau đó mới kết nối đến máy chủ trò chơi thông qua quá trình bắt tay (handshake). Nếu kết nối đến máy chủ game bị ngắt, chỉ cần sử dụng lại token để thực hiện handshake mà không cần quay lại đăng nhập từ đầu. Tất nhiên, người dùng vẫn có thể chọn cách đăng nhập lại hoàn toàn để làm mới trạng thái - tương đương với việc “offline rồi online” theo cách truyền thống.
Khác biệt hoàn toàn với giao thức HTTP thông thường, hệ thống này cho phép gửi nhiều yêu cầu đồng thời trên cùng một kết nối, đồng thời máy chủ có thể phản hồi không theo thứ tự. Mỗi yêu cầu đều được gắn với một session để chính xác xác định cặp yêu cầu-phản hồi tương ứng.
Đặc biệt, nhờ vào cơ chế session linh hoạt, việc “đẩy tin nhắn chủ động từ server về client” - vốn là bài toán phức tạp, giờ đây trở nên đơn giản như sau: Sau khi thiết lập kết nối, client chỉ cần gửi một yêu cầu “đặt hàng” trước tới server để chờ nhận dữ liệu đẩy xuống. Nếu server chưa có gì cần gửi, phiên session đó sẽ được tạm treo. Đến khi có tin nhắn cần đẩy, server sẽ sử dụng chính session này để phản hồi. Ngay khi nhận được phản hồi, client lập tức gửi yêu cầu mới để tiếp tục vòng lặp. Để tối ưu hiệu suất, client có thể gửi cùng lúc nhiều yêu cầu “đặt hàng” để server xử lý tuần tự.
Trong trường hợp kết nối bị ngắt giữa chừng dẫn đến mất gói tin, hệ thống sẽ tự động xử lý bằng cách: Khi thiết lập kết nối mới, client gửi lại các gói yêu cầu trước đó với session không đổi. Server khi nhận được yêu cầu trùng session nhưng không thuộc kết nối hiện tại sẽ kiểm tra cache phản hồi đã lưu. Nếu cache còn hiệu lực, server chỉ cần gửi lại phản hồi đã lưu. Trường hợp cache hết hạn, hệ thống sẽ “kick” người dùng ra và yêu cầu thực hiện lại toàn bộ quy trình đăng nhập để đảm bảo an toàn.
Từ góc độ lập trình nghiệp vụ, công việc trở nên cực kỳ đơn giản. Developer chỉ cần viết một hàm Lua xử lý logic yêu cầu-phản hồi, không cần bận tâm đến các vấn đề kết nối. Hàm này có nhiệm vụ nhận chuỗi yêu cầu đầu vào và trả về chuỗi phản hồi thích hợp.
Để hiểu rõ hơn, mời các bạn tham khảo bộ 3 tài liệu chi tiết mình đã cập nhật trên wiki của Skynet:
- Máy chủ xác thực (Authentication Server)
- Máy chủ cổng (Gateway Server)
- Máy chủ tin nhắn (Message Server)