Làm thế nào là cân bằng tải đạt được trong MMO?


26

Tôi tin rằng đó là một yêu cầu chung của MMO rằng việc xử lý cho một phân đoạn hoặc một lĩnh vực có thể được thực hiện trên một số máy chủ để giảm tải. Tôi tò mò về cách làm điều này có thể được thực hiện trong khi duy trì một thế giới thống nhất thống nhất nơi tất cả người chơi và tất cả các NPC có thể tương tác.

Câu hỏi của tôi là làm thế nào cân bằng tải đạt được trong MMO?

Bất kỳ liên kết, sách hoặc thông tin chung về cách cải thiện kiến ​​thức của tôi về chủ đề này cũng được đánh giá cao.

Câu trả lời:


30

Cố gắng giữ điều này đơn giản nhất có thể và các giao diện được xác định rõ ràng và được ghi lại. Duy trì và gỡ lỗi một hệ thống phức tạp trong sản xuất dễ dàng biến thành địa ngục. Vì vậy, nếu có một cách tiếp cận đơn giản và phức tạp, hãy suy nghĩ kỹ trước khi bạn thực hiện phương pháp phức tạp.

Dịch vụ xác định

Tôi nghĩ bước đầu tiên là xác định các dịch vụ và sự phụ thuộc của chúng : Nội dung tĩnh, Xác thực, Trò chuyện địa phương, Kênh trò chuyện toàn cầu, Kênh trò chuyện khu vực, Danh sách bạn bè, Bang hội, Túi / Kho, Nhà đấu giá, Bản đồ toàn cầu, Thế giới, ...

Sau đó, cho mỗi dịch vụ này quyết định nếu khách hàng có thể nói chuyện trực tiếp với họ. Ví dụ, khá dễ dàng để cho phép khách hàng nói chuyện trực tiếp với các máy chủ chịu trách nhiệm về Kênh trò chuyện toàn cầu. Các máy chủ thế giới hoàn toàn không phải tham gia vào các tin nhắn trò chuyện. Trò chuyện khu vực có thể được thực hiện theo cách tương tự, nhưng các máy chủ thế giới phải thông báo cho các máy chủ trò chuyện khi người chơi thay đổi khu vực. Một lần nữa, họ không phải quan tâm đến các tin nhắn.

Bước thứ ba là suy nghĩ về cân bằng tải trong một dịch vụ . Ví dụ, các kênh trò chuyện toàn cầu và khu vực có thể được phân chia trên nhiều máy chủ dựa trên tên của họ. Có lẽ là một ý tưởng tốt để không cứng mã này tách thành máy khách, nhưng cung cấp một dịch vụ tra cứu.

Máy chủ thế giới

Phần khó nhất thường là các máy chủ thế giới , vì vậy tôi bắt đầu với một cách tiếp cận đơn giản. Có lẽ là một ý tưởng tốt để cho khách hàng nói chuyện trực tiếp với máy chủ chịu trách nhiệm về khu vực anh ta đang ở. Vì vậy, khi đăng nhập hoặc khu vực đi qua máy khách phải được thông báo cho máy chủ nào để kết nối.

Cách tiếp cận đơn giản là chia thế giới thành các khu vực độc lập . Với các khu vực độc lập, ý tôi là người chơi không thể nhìn từ bộ phận này sang bộ phận khác và quái vật không thể giao nhau. Các khu vực đó khác với các khu vực người chơi nhìn thấy dựa trên phong cảnh và câu chuyện của thế giới bên ngoài. Thông thường hầu hết các quái vật đều ở trong ngục tối và người chơi có xu hướng chấp nhận rằng họ phải đi bộ qua một cổng để vào ngục tối. Đặc biệt là nếu những dungeon đó được khởi tạo trên cơ sở mỗi nhóm người chơi. Các ví dụ khác về thế giới bên ngoài là các lục địa và thung lũng khác nhau được bao quanh bởi những ngọn núi cao.

Một cách tiếp cận thế giới liên tục trở nên phức tạp thực sự nhanh chóng, vì vậy thật hợp lý khi lên kế hoạch cho nó: khách hàng cần thông tin gì? Những thông tin nào các máy chủ phải chia sẻ? Người chơi sẽ chủ yếu chỉ tương tác với các đối tượng (bao gồm cả quái vật và NPC) trong cùng khu vực. Bạn có thể gian lận bằng cách đặt các đối tượng ra khỏi phạm vi nhấp từ đường viền khu vực. Điều này có nghĩa là khách hàng chủ yếu quan tâm đến việc chỉ đọc thông tin cho các khu vực lân cận. Đối với những trường hợp này, các máy chủ khu vực không phải phối hợp bất cứ thứ gì ngoại trừ kiểm tra quyền cho phép người chơi đủ gần để kết nối với khu vực lân cận.

Điều này chỉ để lại một số lượng rất nhỏ các trường hợp khó khăn trong đó các đối tượng hoặc hành động phải vượt qua biên giới máy chủ. Đó là một điều tốt bởi vì những trường hợp như mũi tên và phép thuật là hiệu suất quan trọng. Nó có thể là một ý tưởng tốt để phân chia chiến đấu thành tấn công và phòng thủ. Vì vậy, máy chủ của một caster chính tả sẽ xác định các tham số tấn công bao gồm cả vị trí của caster. Máy chủ của hậu vệ sẽ nhận được thông báo về cuộc tấn công và tính toán tác động. Máy chủ của kẻ tấn công không cần biết về tác động; khách hàng sẽ tìm hiểu về nó bằng cách sử dụng kết nối chỉ đọc của mình.

Tùy thuộc vào mức độ phức tạp của mô hình trình phát của bạn, có thể mất vài giây để chuyển nó sang máy chủ khác (Cuộc sống thứ hai có vấn đề rất lớn với việc này). Vấn đề có thể được giảm thiểu bằng cách chuẩn bị chuyển khoản trước khi người chơi đến gần biên giới ảo. Vì vậy, hầu hết dữ liệu người chơi đã được lưu trữ trên máy chủ đích khi việc chuyển giao thực tế xảy ra.

Tóm lược

Phân chia vấn đề bằng cách xác định các dịch vụ khác nhau có thể được phân chia trên các máy chủ với ít sự phụ thuộc. Bước tiếp theo hãy xem làm thế nào để cân bằng tải trong các dịch vụ quan trọng. Đại biểu cân bằng công việc cho khách hàng bằng cách hướng dẫn nó kết nối trực tiếp với các máy chủ có liên quan (rõ ràng các máy chủ phải kiểm tra quyền). Giữ nó đơn giản nhất có thể, ghi lại trách nhiệm của các dịch vụ và máy chủ khác nhau, cung cấp tùy chọn để bật đầu ra gỡ lỗi.

PS: Một số kỹ thuật này có thể được sử dụng để cải thiện độ tin cậy. Và bạn nên ghi nhớ điều đó bởi vì sử dụng nhiều máy chủ tiềm ẩn nguy cơ phá vỡ mọi thứ cao hơn nhiều; không chỉ ở phần mềm mà còn ở cấp độ phần cứng.


Nhưng thực sự, làm thế nào để bạn thực hiện giao tiếp liên tiến trình này? Nên sử dụng loại IPC nào?
majidarif

10

Nói chung, thế giới được chia thành một số khu vực nhỏ hơn. Mỗi khu vực này thường là một quy trình máy chủ độc lập (máy chủ thế giới của WoW hoặc các nút Sol của Eve) và có thể chạy trên bất kỳ máy nào trong số các máy. Trong một số trò chơi, có những cánh cửa rõ ràng giữa các bản đồ (Eve, STO, Guild Wars) trong khi những trò chơi khác cố gắng che giấu điều này nhiều hơn (WAR, Free Realms). Những người lựa chọn cách tiếp cận liền mạch hơn thường sẽ phát hiện khi bạn ở gần biên giới giữa hai máy chủ và hai quá trình đàm phán bàn giao. Nơi tốt nhất có lẽ để tìm kiếm một mô tả về điều này là trong cách các tháp di động thực hiện các thiết bị cầm tay di chuyển. Nếu tải của một bản đồ (Jita, Ironforge, Earth Space Dock) thực sự lớn, đôi khi bạn có thể giảm tải các chức năng riêng lẻ cho các máy chủ khác (AI, một số phần nhất định của quản lý người chơi) nhưng điều này hoặc phải được tích hợp ngay từ đầu hoặc sẽ thực hiện một số cải tiến nghiêm trọng. Hầu như luôn luôn hiệu quả hơn về chi phí khi chỉ cần mua phần cứng tốt hơn để dành cho vài bản đồ đó.


9

Tôi tin rằng đó là một yêu cầu chung của MMO rằng việc xử lý cho một phân đoạn hoặc một lĩnh vực có thể được thực hiện trên một số máy chủ để giảm tải. Tôi tò mò về cách làm điều này có thể được thực hiện trong khi duy trì một thế giới thống nhất thống nhất nơi tất cả người chơi và tất cả các NPC có thể tương tác.

Nó có thể không phổ biến như bạn nghĩ; ít nhất, không phải nếu bạn nghĩ rằng một thế giới liền mạch được quản lý bởi nhiều máy chủ cùng một lúc.

Không tính các phân đoạn hoàn toàn riêng biệt, có 2 hướng trong đó bạn có thể chia ra một trò chơi trực tuyến, có thể được coi là "ngang" và "dọc":

  • Chia trò chơi thành nhiều khu vực địa lý riêng biệt. Tất cả các chức năng cho bất kỳ khu vực địa lý nhất định được xử lý bởi một máy chủ và không có tương tác thực sự giữa chúng. (Lưu ý rằng không nhất thiết chỉ có 1 vùng trên mỗi máy chủ - một máy chủ có thể xử lý đồng thời nhiều vùng và có thể chuyển vùng giữa các máy chủ để xử lý tải thay đổi.)
  • Chia trò chơi thành nhiều loại dịch vụ - ví dụ: đăng nhập / ủy quyền, quy tắc chơi trò chơi và vật lý, trò chuyện + đấu giá, kiên trì, vv Mỗi dịch vụ này có thể được xử lý bởi một máy chủ khác nhau. Câu trả lời của nhnb đã liệt kê các dịch vụ tiềm năng khác mà nhà phát triển có thể phân vùng trò chơi của họ.

Rõ ràng những cách tiếp cận này là trực giao và bạn có thể kết hợp cả hai. Trên thực tế, gần như bắt buộc phải có một máy chủ cơ sở dữ liệu riêng biệt, rất phổ biến để tắt đăng nhập / xác thực trên một máy riêng biệt khỏi trò chơi và ngày càng phổ biến để kết nối trò chuyện và các giao tiếp không quan trọng khác, bất kể thế giới trò chơi của bạn như thế nào được chia ra.

Nhưng nhìn chung, khi có phân vùng địa lý, hầu hết các trò chơi đều tránh cho phép bạn tương tác qua các ranh giới đó, vì khó thực hiện tốt. Thay vào đó, họ dùng đến những cách khác để làm cho có vẻ như tất cả bạn vẫn ở trong cùng một mảnh vỡ và trên cùng một máy chủ, khi thực sự bạn không như vậy. ví dụ. - tải màn hình hoặc hình ảnh động khác che đậy thay đổi máy chủ khi chuyển đổi giữa các khu vực hoặc từ lục địa này sang lục địa khác. - các trường hợp ngục tối hoặc đột kích riêng biệt được cách ly với mọi người khác. Chúng giống như một mảnh vỡ trong một mảnh vỡ và có thể dễ dàng chạy trên một máy chủ riêng biệt, giúp cân bằng tải.

Tôi không thể nói chuyện với chính quyền trên WoW nhưng tôi đoán họ đang làm gần như tất cả những điều trên: tạo ra các khu vực địa lý riêng biệt không thể tương tác được nối với nhau bằng các cổng, một số máy chủ backh và auth riêng biệt. Tôi đã nghe nói rằng các vương quốc WoW có một cái gì đó từ 1000 đến 10000 người chơi trực tuyến trong một lĩnh vực nhất định cùng một lúc, có thể dễ dàng quản lý với các sơ đồ trên.

Tuy nhiên, giả sử bạn có một thế giới rộng lớn duy nhất và bạn cần phải cho phép người chơi một máy chủ tương tác với người chơi trên một máy chủ liền kề. Về mặt lý thuyết, điều này rất dễ thực hiện - trước tiên, các máy chủ phải hợp tác để chia sẻ chi tiết về các đối tượng dọc theo biên giới (vì vậy một đối tượng trên một máy chủ có thể có đại diện proxy trên một máy chủ khác), sau đó chỉ cần thay đổi tất cả logic của bạn sang truyền tin nhắn, với tin nhắn được chuyển từ proxy trở lại nguồn có thẩm quyền khi cần thiết. Tin nhắn có thể được chuyển qua lại giữa các máy chủ hoặc trong một máy chủ khá trong suốt để một cách tiếp cận phù hợp với tất cả các hệ thống.

Vấn đề ở đây là logic đơn giản trước đây có thể trở nên rất phức tạp khi được dịch sang tin nhắn - vd. giao dịch 2 người chơi có thể diễn ra an toàn và nguyên tử khi cả hai người chơi trên một máy chủ trở thành quá trình dài hơn khi các tin nhắn phải được gửi qua lại, được hoàn nguyên trên mỗi lần gửi và bảo vệ an toàn để đảm bảo rằng một người chơi không thể khai thác khác bằng cách thay đổi giao dịch trong khi một tin nhắn đang đi du lịch. Bạn thậm chí không thể cho rằng người chơi khác sẽ vẫn tồn tại vào thời điểm tin nhắn đến (vì họ có thể chết, đăng xuất, v.v.), vì vậy mã trở nên rất phức tạp. Và điều này sẽ áp dụng cho hầu hết mọi hệ thống mà 2 hoặc nhiều thực thể có thể tương tác hoặc hợp tác - thương mại, chiến đấu, nhóm, đấu giá, chia sẻ chiến lợi phẩm, đào tạo, v.v.

Những vấn đề này không thể khắc phục được nhưng đối với hầu hết các trò chơi, chúng quá khó để thử khi bạn có thể chia sẻ tải thông qua các phương tiện khác và giữ tất cả logic trò chơi của bạn trên một máy chủ. Vì vậy, gần như tất cả các trò chơi hiện tại đi xuống tuyến đường thay thế.


3

Có nhiều phương pháp cân bằng tải cho máy chủ MMO, vì có khá nhiều dữ liệu cần xử lý. Tôi thích phương pháp bin bin quá trình.

Một máy chủ toàn cầu chuyển các kết nối người dùng đến một thùng quy trình có thể xử lý nhiều người dùng cùng một lúc. các thùng quy trình thực hiện tất cả các xử lý phức tạp và chỉ phản hồi với máy chủ toàn cầu với dữ liệu có liên quan trên toàn cầu như trò chuyện và định vị toàn cầu. Phương pháp này cân bằng tốt hơn nhiều so với các máy chủ khu vực, vì các khu vực có thể khác nhau rất nhiều về dân số, trong khi xử lý người dùng tổng thể đủ khác nhau để tự nhiên sẽ tự cân bằng cho hầu hết các phần.

Chỉ cần thực hiện một số cân bằng tải cơ bản thông qua máy chủ toàn cầu để khi một thùng quy trình đạt đến mức sử dụng bộ nhớ / cpu nhất định, bạn sẽ khởi động máy chủ bin quy trình mới.


Làm thế nào để bạn chia sẻ dữ liệu được chia sẻ giữa các thùng quy trình, ví dụ như cuộc chiến giữa hai người dùng trên các thùng quy trình khác nhau. Làm thế nào để bạn đảm bảo thứ tự của các sự kiện? Vì vậy, một người chơi bị giết không thể thực hiện bất kỳ cuộc tấn công nào nữa, ngay cả khi thùng giết chết anh ta chậm hơn thùng thực hiện cuộc tấn công. Có nguy cơ chi phí vận chuyển lên cao trên máy chủ toàn cầu không? Mô hình proxy cho các kết nối người dùng có thể đi vào giới hạn hệ điều hành trên ngăn xếp mạng.
Hendrik Brummermann

Mô hình này hoạt động khá tốt trong các hệ thống thông tin nơi hầu hết các giao dịch được cách ly. Ý tôi là chúng thường không hoạt động trên cùng một dữ liệu và trong các trường hợp hiếm hoi, khóa hoặc rollback được sử dụng. Nhưng trong các trò chơi mà các trận đánh bao gồm nhiều người chơi và / hoặc sinh vật, và tác động của các cuộc tấn công bị ảnh hưởng bởi các thuộc tính của cả kẻ tấn công và người phòng thủ, cách tiếp cận này có thể khó khăn.
Hendrik Brummermann

Bạn có thể đi một cách dễ dàng và coi các tương tác của nhiều người dùng có liên quan trên toàn cầu hoặc bạn có thể tạo một phương pháp đơn giản để các thùng xử lý nhận thức được nhau và giao tiếp. Mỗi thùng quy trình sẽ có thể xử lý khoảng mười nghìn người dùng cùng một lúc, do đó, việc liên lạc giữa các người dùng không nên là vấn đề quá lớn. Phương pháp khu vực dễ dàng hơn một chút, nhưng không cân bằng và có thể dễ dàng bị sập nếu có quá nhiều người dùng vào cùng một khu vực. Trong một MMORPG có lượng người dùng lớn cân bằng tải rất đồng đều là rất quan trọng.
Stephen Belanger

Tôi rất muốn biết "một phương pháp đơn giản" cho 2 thùng quy trình để có thể đàm phán một hệ thống như chiến đấu. Vấn đề không phải là comms cấp thấp mà các thuật toán chơi trò chơi thông thường trở nên rất phức tạp với những người tham gia phân tán.
Kylotan

Trong triển khai của tôi, máy chủ toàn cầu của tôi duy trì một danh sách tất cả các máy khách được kết nối và theo dõi thùng rác mà chúng được kết nối. Nếu một thùng quy trình cần truy cập vào người dùng khác, trước tiên, nó sẽ kiểm tra danh sách người dùng của chính nó. Nếu thất bại, nó sẽ kiểm tra danh sách toàn cầu và xác định quá trình mà người dùng khác kết nối với. Các thùng quy trình sau đó kết nối trực tiếp để chia sẻ trạng thái người dùng trong khi nó xử lý thống nhất.
Stephen Belanger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.