W jaki sposób osiąga się równoważenie obciążenia w MMO?


26

Uważam, że powszechnym wymogiem MMO jest to, że przetwarzanie pojedynczego fragmentu lub dziedziny może być wykonywane na kilku serwerach, aby zmniejszyć obciążenie. Jestem ciekawy, jak to zrobić, zachowując jednolity spójny świat, w którym wszyscy gracze i wszyscy NPC mogą wchodzić w interakcje.

Moje pytanie brzmi: w jaki sposób osiąga się równoważenie obciążenia w MMO?

Doceniamy również wszelkie linki, książki lub ogólne informacje o tym, jak poprawić moją wiedzę na ten temat.

Odpowiedzi:


30

Staraj się, aby było to tak proste, jak to możliwe, a interfejsy dobrze zdefiniowane i udokumentowane. Utrzymanie i debugowanie złożonego systemu w produkcji łatwo przeradza się w piekło. Więc jeśli istnieje proste i złożone podejście, zastanów się dwa razy, zanim przejdziesz do tego złożonego.

Definiowanie usług

Myślę, że pierwszym krokiem jest identyfikacja usług i ich zależności : zawartość statyczna, uwierzytelnianie, czat lokalny, globalne kanały czatu, regionalne kanały czatu, lista znajomych, gildie, torba / ekwipunek, dom aukcyjny, mapa globalna, świat, ...

Następnie dla każdej z tych usług zdecyduj, czy klient może z nimi bezpośrednio porozmawiać. Na przykład dość łatwo jest pozwolić klientowi rozmawiać bezpośrednio z serwerami odpowiedzialnymi za globalne kanały czatu. Światowe serwery wcale nie muszą być zaangażowane w wiadomości czatu. Czat regionalny można wdrożyć w ten sam sposób, ale serwery świata muszą informować serwery czatu, gdy gracze zmieniają regiony. Znów nie muszą przejmować się wiadomościami.

Trzecim krokiem jest zastanowienie się nad równoważeniem obciążenia w ramach usługi . Na przykład globalne i regionalne kanały czatu można podzielić na wiele serwerów na podstawie ich nazwy. Prawdopodobnie dobrym pomysłem jest nie kodowanie tego podziału na klienta na sztywno, ale zapewnienie usługi wyszukiwania.

Serwery świata

Najtrudniejsze są zazwyczaj serwery świata , więc zaczynam od prostego podejścia. Prawdopodobnie dobrym pomysłem jest pozwolenie klientowi na bezpośrednią rozmowę z serwerem odpowiedzialnym za region, w którym się znajduje. Dlatego przy logowaniu lub przekraczaniu regionu klient musi zostać poinformowany, z którym serwerem się połączyć.

Proste podejście polega na podzieleniu świata na niezależne regiony . Z niezależnymi regionami mam na myśli to, że gracz nie może patrzeć z jednej części na drugą, a potwory nie mogą się krzyżować. Regiony te różnią się od regionów widzianych przez gracza na podstawie krajobrazu i historii świata zewnętrznego. Zwykle większość potworów znajduje się w lochach, a gracze zwykle akceptują, że muszą przejść przez bramę, aby wejść do lochu. Zwłaszcza jeśli te lochy są tworzone na podstawie grup graczy. Innymi przykładami na świecie zewnętrznym są różne kontynenty i doliny otoczone wysokimi górami.

Ciągły świat podejście bardzo szybko staje się skomplikowane, więc ma to sens, aby go dobrze zaplanować: Jakie informacje potrzeby klienta? Jakie informacje muszą udostępniać serwery? Gracz będzie przede wszystkim wchodził w interakcje tylko z przedmiotami (w tym potworami i postaciami niezależnymi) w tym samym regionie. Możesz oszukiwać, umieszczając obiekty poza zasięgiem kliknięcia od granicy strefy. Oznacza to, że klient jest głównie zainteresowany informacjami tylko do odczytu dla sąsiednich stref. W takich przypadkach serwery strefy nie muszą koordynować niczego poza sprawdzaniem uprawnień, czy gracz jest wystarczająco blisko, aby połączyć się z sąsiednią strefą.

Pozostawia to bardzo niewielką liczbę trudnych przypadków, w których obiekty lub działania muszą przekroczyć granicę serwera. Co jest dobre, ponieważ przypadki takie jak strzały i zaklęcia mają krytyczne znaczenie dla wydajności. Dobrym pomysłem może być podzielenie walki na atak i obronę. Tak więc serwer rzucającego zaklęcia określi parametry ataku, w tym pozycję rzucającego. Serwer obrońcy otrzyma wiadomość o ataku i obliczy wpływ. Serwer atakującego nie musi wiedzieć o wpływie; klient dowie się o tym za pomocą połączenia tylko do odczytu.

W zależności od stopnia złożoności twojego modelu gracza, przeniesienie go na inny serwer może potrwać kilka sekund (Second Life ma z tym ogromny problem). Problem można złagodzić, przygotowując przelew z wyprzedzeniem, gdy gracz zbliży się do wirtualnej granicy. Tak, że większość danych odtwarzacza jest już buforowana na serwerze docelowym, gdy nastąpi faktyczne przełączenie.

Podsumowanie

Podziel problem, definiując różne usługi, które można podzielić na serwery o niewielkich zależnościach. W następnym kroku przyjrzyj się, jak przeprowadzić równoważenie obciążenia w ramach najważniejszych usług. Przekaż pracę równoważenia klientowi, instruując go, aby łączył się bezpośrednio z odpowiednimi serwerami (oczywiście serwery muszą sprawdzać uprawnienia). Uprość to, tak prosto, jak to możliwe, dobrze udokumentuj obowiązki różnych usług i serwerów, zapewnij opcję włączenia wyjścia debugowania.

PS: Niektóre z tych technik można wykorzystać do poprawy niezawodności. I powinieneś o tym pamiętać, ponieważ korzystanie z wielu serwerów wiąże się ze znacznie większym ryzykiem awarii; nie tylko w oprogramowaniu, ale także na poziomie sprzętowym.


Ale tak naprawdę, jak robisz tę komunikację międzyprocesową? jakiego rodzaju IPC należy zastosować?
majidarif

10

Ogólnie świat jest podzielony na kilka mniejszych regionów. Każdy z tych regionów jest zwykle niezależnym procesem serwerowym (serwery światowe WoW lub węzły Eve's Sol) i można go uruchomić na dowolnej liczbie komputerów. W niektórych grach istnieją wyraźne drzwi między mapami (Eve, STO, Guild Wars), podczas gdy inne próbują to bardziej maskować (WAR, Free Realms). Ci, którzy wybiorą bardziej płynne podejście, na ogół wykryją, gdy zbliżasz się do granicy między dwoma serwerami, a dwa procesy negocjują przekazanie. Najlepszym miejscem, by prawdopodobnie poszukać opisu tego, jest sposób, w jaki wieże komórkowe przekazują ruchome słuchawki. Jeśli obciążenie jednej mapy (Jita, Ironforge, Earth Space Dock) staje się naprawdę duże, czasami możesz odciążyć poszczególne funkcje na inne serwery (AI, niektóre elementy zarządzania graczami), ale musi to być wbudowane od samego początku lub wymagać poważnej modernizacji. Prawie zawsze bardziej opłacalne jest kupowanie lepszego sprzętu przeznaczonego na te kilka map.


9

Uważam, że powszechnym wymogiem MMO jest to, że przetwarzanie pojedynczego fragmentu lub dziedziny może być wykonywane na kilku serwerach, aby zmniejszyć obciążenie. Jestem ciekawy, jak to zrobić, zachowując jednolity spójny świat, w którym wszyscy gracze i wszyscy NPC mogą wchodzić w interakcje.

Prawdopodobnie nie jest tak powszechne, jak myślisz; przynajmniej nie, jeśli myślisz, że jednym płynnym światem zarządza kilka serwerów jednocześnie.

Nie licząc całkowicie oddzielnych odłamków, istnieją 2 kierunki, w których można podzielić grę online, które można uznać za „poziome” i „pionowe”:

  • Podziel grę na wiele oddzielnych obszarów geograficznych. Wszystkie funkcje dla danego obszaru geograficznego są obsługiwane przez jeden serwer i nie ma między nimi żadnej rzeczywistej interakcji. (Pamiętaj, że niekoniecznie musi istnieć tylko 1 strefa na serwer - serwer może obsługiwać kilka stref jednocześnie, a strefy mogą być przesyłane między serwerami w celu obsługi zmieniającego się obciążenia).
  • Podziel grę na kilka rodzajów usług - np. logowanie / autoryzacja, zasady gry i fizyka, czat + aukcje, wytrwałość itp. Każda z tych usług może być obsługiwana przez inny serwer. W odpowiedzi nhnb wymieniono inne potencjalne usługi, na które deweloper może podzielić swoją grę.

Oczywiście te podejścia są ortogonalne i można je połączyć. W rzeczywistości prawie obowiązkowe jest posiadanie osobnego serwera bazy danych, bardzo często wypychanie loginu / autoryzacji na oddzielną maszynę od gry, a coraz bardziej powszechne jest także utrzymywanie czatu i innej niekrytycznej komunikacji, bez względu na to, w jaki sposób grasz jest podzielony.

Ale ogólnie rzecz biorąc, gdy istnieje podział geograficzny, większość gier unika interakcji z tymi granicami, ponieważ trudno jest dobrze sobie radzić. Zamiast tego uciekają się do innych sposobów, aby sprawiać wrażenie, jakbyś wciąż był w tym samym odłamku i na tym samym serwerze, kiedy tak naprawdę nie jesteś. na przykład. - ładowanie ekranów lub innych animacji zakrywających zmianę serwera podczas przejścia między strefami lub z jednego kontynentu na inny. - oddzielne instancje w lochach lub rajdach, które są odizolowane od wszystkich innych. Są one jak odłamek w odłamku i można je łatwo uruchomić na osobnym serwerze, co pomaga w równoważeniu obciążenia.

Nie mogę rozmawiać z autorytetem na WoW, ale sądzę, że robią prawie wszystkie powyższe: instancje, oddzielne obszary geograficzne, które nie mogą wchodzić w interakcje, połączone jakimś portalem, oddzielne serwery zaplecza i serwery autoryzacji. Słyszałem, że królestwa WoW mają jednocześnie od 1000 do 10000 graczy online w danym królestwie, co można łatwo zarządzać za pomocą powyższych schematów.

Załóżmy jednak, że masz jeden ogromny świat i że musisz pozwolić graczom na jeden serwer na interakcję z graczami na sąsiednim serwerze. Teoretycznie jest to łatwe - po pierwsze, serwery muszą współpracować, aby dzielić się szczegółami obiektów wzdłuż granic (więc obiekt na jednym serwerze może mieć reprezentację proxy na innym), a następnie po prostu zmienić całą logikę na przekazywanie wiadomości, z w razie potrzeby wiadomości są kierowane z serwera proxy z powrotem do wiarygodnego źródła. Wiadomości mogą być przekazywane między serwerami lub w obrębie serwera dość transparentnie, więc jedno podejście pasuje do wszystkich systemów.

Problem polega na tym, że wcześniej prosta logika może stać się bardzo złożona po przetłumaczeniu na wiadomości - np. handel 2 graczami, który może się odbywać bezpiecznie i atomowo, gdy obaj gracze znajdują się na jednym serwerze, staje się dłuższym procesem, gdy wiadomości muszą być wysyłane tam iz powrotem, weryfikowane przy każdym wysyłaniu oraz wprowadzane zabezpieczenia zapewniające, że jeden gracz nie może wykorzystać drugi, zmieniając handel w trakcie podróży wiadomości. Nie możesz nawet założyć, że inny gracz będzie istniał do czasu nadejścia wiadomości (ponieważ mogą umrzeć, wylogować się itp.), Więc kod staje się bardzo złożony. Dotyczy to prawie każdego systemu, w którym 2 lub więcej podmiotów może wchodzić w interakcje lub współpracować - handlować, walczyć, grupować, aukcje, udostępniać łupy, szkolenia itp.

Problemy te nie są nie do pokonania, ale w przypadku większości gier zbyt trudno jest je podjąć, gdy możesz podzielić się obciążeniem za pomocą innych środków i zachować całą logikę gry na jednym serwerze. Tak więc prawie wszystkie obecne gry podążają tą drogą.


3

Istnieje wiele metod równoważenia obciążenia serwera MMO, ponieważ do przetworzenia jest dość szeroki zakres danych. Wolę metodę drzewa bin bin.

Serwer globalny przekazuje połączenia użytkowników do kosza procesów, który może obsługiwać kilku użytkowników jednocześnie. pojemniki procesowe wykonują całe złożone przetwarzanie i odpowiadają tylko na globalnym serwerze danymi, które są globalnie istotne, takie jak globalny czat i pozycjonowanie. Ta metoda równoważy znacznie lepiej niż serwery regionalne, ponieważ regiony mogą znacznie różnić się populacją, podczas gdy ogólne przetwarzanie użytkowników jest wystarczająco zróżnicowane, aby w naturalny sposób samo się równoważyło.

Wystarczy wykonać podstawowe równoważenie obciążenia za pośrednictwem serwera globalnego, aby po osiągnięciu określonego poziomu wykorzystania pamięci / procesora przez bin procesowy uruchomiono nowy serwer bin procesowych.


Jak współdzielić dane współdzielone między procesami, na przykład walka między dwoma użytkownikami na różnych procesach. Jak zapewnić porządek wydarzeń? Aby zabity gracz nie mógł już wykonać żadnego ataku, nawet jeśli kosz, który go zabije, jest wolniejszy niż kosz wykonujący atak. Czy istnieje ryzyko, że koszty globalne związane z wysyłaniem osiągną wysoki poziom na serwerze globalnym? Model proxy dla połączeń użytkowników może wchodzić w ograniczenia systemu operacyjnego na stosie sieciowym.
Hendrik Brummermann

Ten model działa całkiem dobrze w systemach informatycznych, w których większość transakcji jest izolowana. Mam na myśli, że zwykle nie działają na tych samych danych, aw rzadkich przypadkach stosuje się blokowanie lub wycofywanie. Ale w grach, w których w walce bierze udział wielu graczy i / lub stworzeń, a na wpływ ataków mają zarówno atrybuty atakującego, jak i obrońcy, takie podejście może być trudne.
Hendrik Brummermann

Możesz albo przejść prostą drogę i uznać interakcje między wieloma użytkownikami za globalne lub możesz stworzyć prostą metodę, aby pojemniki procesów były świadome siebie i komunikowały się. Każdy bin procesu powinien być w stanie obsłużyć około dziesięciu tysięcy użytkowników jednocześnie, więc komunikacja między użytkownikami nie powinna stanowić większego problemu. Metoda regionu jest nieco łatwiejsza, ale nie tak zrównoważona, i można ją łatwo rozbić, jeśli zbyt wielu użytkowników wejdzie do tego samego regionu. W MMORPG z dużym równoważeniem bazy użytkowników obciążenie jest bardzo ważne.
Stephen Belanger

Chciałbym znać „prostą metodę” dla 2 pojemników procesowych, aby móc negocjować system taki jak walka. Problemem nie są komunikatory niskiego poziomu, ale typowe algorytmy rozgrywki bardzo się komplikują w przypadku rozproszonych uczestników.
Kylotan

W mojej implementacji mój serwer globalny utrzymuje listę wszystkich połączonych klientów i śledzi, do którego bin procesu są podłączeni. Jeśli bin procesowy potrzebuje dostępu do innego użytkownika, najpierw sprawdza własną listę użytkowników. Jeśli to się nie powiedzie, sprawdza listę globalną i identyfikuje, do którego bin procesu jest podłączony inny użytkownik. Pojemniki procesowe następnie łączą się bezpośrednio, aby udostępniać stany użytkowników podczas przetwarzania ujednoliconego.
Stephen Belanger
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.