Multicast Trong Máy Chủ Trò Chơi - nói dối e blog

Multicast Trong Máy Chủ Trò Chơi

Trong thiết kế hệ thống máy chủ game, việc phát đa điểm (multicast) là một yêu cầu phổ biến. Chẳng hạn, khi một nhân vật NPC cần truyền phát trạng thái của mình đến các người chơi xung quanh, hay trong các kênh chat đa dạng, việc gửi tin nhắn đến toàn bộ thành viên trong kênh đều đòi hỏi cơ chế phát đa điểm hiệu quả.

Thông thường, mỗi yêu cầu phát đa điểm sẽ được quản lý thông qua một danh sách kết nối tương ứng. Tuy nhiên, nếu thiết kế không cẩn trọng, việc duy trì hàng loạt danh sách này có thể trở thành nguồn gốc của nhiều lỗi hệ thống, đặc biệt trong kiến trúc đa máy chủ. Trong những ngày qua, tôi đã nghiên cứu để tìm ra một giải pháp thống nhất và tối ưu cho vấn đề này.

Trước đó, blog đã thảo luận về việc thiết lập nhiều điểm kết nối bên ngoài trên cụm máy chủ. Dựa trên ý tưởng này, chúng ta có thể mở rộng thêm: Khi mỗi máy chủ kết nối giới hạn ở mức 8192 kết nối đồng thời, việc quản lý các nhóm kết nối sẽ trở nên nhẹ nhàng hơn nhiều.

Chúng ta chỉ cần định nghĩa 4 giao thức cơ bản giữa máy chủ logic và máy chủ kết nối:

  1. Thêm một kết nối vào nhóm chỉ định
  2. Loại bỏ kết nối khỏi nhóm
  3. Phát tin nhắn đến toàn bộ nhóm
  4. Xóa nhóm

Hai giao thức cuối thực chất mang tính chất bổ sung. Với giao thức thứ ba, nếu không gian định danh kết nối đủ lớn (ví dụ dùng 4 byte như địa chỉ IP), có thể dành riêng một dải số hiệu để đánh dấu nhóm phát đa điểm. Tuy nhiên trong thiết kế hiện tại sử dụng định danh 2 byte để tiết kiệm băng thông, nên cần giao thức riêng biệt để xử lý.

Về giao thức thứ tư, việc xóa nhóm có thể tự động thực hiện khi thành viên cuối cùng rời đi. Tuy nhiên, việc thêm giao thức xóa thủ công mang lại tiện ích lớn trong vận hành.

Về mặt tài nguyên, việc duy trì nhóm kết nối trên máy chủ chỉ yêu cầu một mảng 1KB (8192 bit). Khi cần phát đa điểm, hệ thống chỉ cần duyệt qua mảng này. Trên kiến trúc 32-bit, thao tác này chỉ cần vòng lặp tối đa 256 lần, bởi đa số nhóm có số thành viên không lớn, khiến phần lớn bit trong mảng ở trạng thái 0.

Kết hợp kỹ thuật danh sách tự do (freelist) và bảng băm (hash table), máy chủ có thể quản lý vô hạn nhóm kết nối với hiệu suất chấp nhận được cả về CPU lẫn bộ nhớ. Thành phần duy nhất cần bổ sung là bộ phân bổ ID nhóm, đảm bảo mỗi tiến trình có không gian định danh nhóm độc lập.

Trong thiết kế hiện tại, để giảm thiểu giao tiếp giữa các tiến trình, việc cấp phát ID nhóm được thực hiện theo cơ chế không cần phản hồi. Mỗi tiến trình có không gian ID nhóm riêng, sau đó được bộ quản lý nhóm ánh xạ đến ID toàn cục duy nhất. Điều này tương tự như cách hệ điều hành quản lý bộ nhớ vật lý - mỗi tiến trình có thể bắt đầu từ nhóm 0, 1, 2… như các địa chỉ “ảo”, sau đó được chuyển đổi sang địa chỉ vật lý thực tế. Giải pháp này hoàn hảo giải quyết vấn đề xung đột ID nhóm giữa các tiến trình máy chủ khác nhau.

0%