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.