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.
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.
źródło
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”:
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ą.
źródło
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.
źródło