Rozproszony serwer gier C ++ korzystający z bazy danych


11

Mój turowy serwer gier C ++ (który korzysta z bazy danych) nie jest w stanie przeciwstawić się bieżącej średniej liczbie klientów (graczy), dlatego chcę rozszerzyć go na wiele (więcej niż jedną) liczbę komputerów i baz danych, w których wszyscy klienci nadal pozostaną w obrębie jeden świat gry (serwery muszą się ze sobą komunikować i korzystać z wielu baz danych).

Czy są jakieś tutoriale / książki / wspólne standardy, które wyjaśniają, jak to zrobić w najlepszy sposób?

Odpowiedzi:


8

Terminologia MMO dotycząca „pozostania w jednym świecie gry” jest pojedyncza odłamkiem . EVE online jest jedyną znaczącą grą MMO, w której każdy gracz może umieścić jednego gracza w jednym odłamku.

Na szczęście opublikowali bardzo pouczający artykuł na temat tego, jak to robią.


(źródło: gamasutra.com )

Złe wiadomości. Zasadniczo nie można stosować technik EVE online. Ich rozwiązania są absolutnie dostosowane do konkretnego gatunku i wdrożenia.
UWAGA : W przypadku wszystkich bardzo fantazyjnych sieci z jednym odłamkiem EVE online korzystają one z jednej bazy danych. Nie byli w stanie zaprojektować skalowalnego, spójnego rozwiązania w umiarkowanym czasie rzeczywistym dla rozproszonych baz danych.

Tak czy inaczej, przeczytanie, w jaki sposób to zrobiło, powinno pomóc ci zaprojektować własne rozwiązanie. Uważaj jednak, próbujesz rozwiązać bardzo trudny problem.

Zamiast dystrybuować serwer gry, sugeruję najpierw zbadanie innych możliwości.

  • Profiluj swój serwer gier.
    • Zoptymalizuj kod serwera, aby zmniejszyć obciążenie procesora, jeśli jest to problem.
    • Zoptymalizuj protokół komunikacyjny między klientami a serwerem, aby ograniczyć rozmowy sieciowe.
  • Zoptymalizuj serwer graczy do komunikacji z bazą danych.
    • uruchom optymalizator zapytań, a następnie wprowadź odpowiednie zmiany.
    • ograniczyć interakcję DB do absolutnego minimum
  • Przenieś bazę danych na osobną maszynę.
    To często pomaga tonie. Jeśli to możliwe, utrzymuj DB w tej samej sieci lokalnej, ale to powinno pomóc Twojemu serwerowi gry być o wiele bardziej podejrzanym, gdy jest to jedyna rzecz działająca na sprzęcie serwerowym.

Jak definiujesz „major”? Kingdom of Loathing używa jednego odłamka. Wszyscy dzielą ten sam odłamek Farmville. Star Trek Online i Champions Online używają modelu pojedynczego odłamka, ale instancji stref.

Zamiast korzystać z bazy danych SQL, możesz również użyć rozwiązania noSQL, które zostało zaprojektowane do klastrowania i dzielenia na fragmenty, takie jak MongoDB.
Philipp

1
@JoeWreschnig gry internetowe nie są grami w czasie rzeczywistym, o wiele łatwiej ... Nie jestem pewien, ilu graczy ma Star Trek Online i Champions Online ...
o0 '.

4

Pierwszym krokiem powinno być oddzielenie bezpośredniego dostępu do bazy danych od serwera gry i użycie oprogramowania pośredniego specyficznego dla użytkowania do przygotowania danych dla serwera (np. XML, JSON). Będą one w stanie obsłużyć dowolną liczbę baz danych, a co ważniejsze, będą w stanie zapewnić ci opcje buforowania specyficzne dla aplikacji. Buforuj wszystko, co możesz i dokuczaj db tylko wtedy, gdy musisz. Dokonuj dużych pobrań i rzadko zamiast wielu małych zapytań, aby osiągnąć najlepszą możliwą wydajność w twoim scenariuszu.

Wybrana baza danych może również umożliwiać obsługę klastrów, które ułatwiają rozbudowę dostępnych zasobów bazy danych i szybsze dostarczanie wyników, ale jest to temat wymagający dużego doświadczenia i dedykowanego administratora bazy danych do skonfigurowania i utrzymania - i nie do końca z budżetu indie.


1
Wszystko to brzmi dobrze, dopóki nie pomyślisz, że ma nadzieję, że wiele serwerów będzie miało dostęp do jednego zestawu danych - oznacza to, że bez dalszej koordynacji pamięci podręczne po stronie aplikacji nie będą synchronizowane, co w najlepszym wypadku spowoduje błędy w grze, aw najgorszym utratę danych. Nie zgadzam się z niczym, co powiedziałeś, ale przed kontynuowaniem oryginalny plakat musi również wziąć pod uwagę kwestię spójności między serwerami.
Kylotan,

Oprogramowanie pośrednie to tunel danych, który z jednej strony jest odpowiedzialny za buforowanie danych, a także za dostarczanie danych. Dostarcza jednak tylko dane do serwera (nigdy do klienta), a serwer buforuje wszystkie dane podstawowe związane z grą podczas uruchamiania. Tak więc w dowolnym momencie może być podłączonych wiele źródeł danych i wielu żądających danych. MMO, nad którym pracuję, wykorzystuje ten schemat raczej skutecznie.
Konrad K.

To wcale nie wyjaśnia, w jaki sposób rozwiązałeś problemy dotyczące spójności między serwerami. W pewnym momencie serwery muszą zsynchronizować dane między sobą lub masz warunki wyścigu, które przejawiają się jako przypadkowe rozłączenia, zduplikowani gracze, zduplikowane przedmioty, brakujące misje itp.

Dane nigdy nie są duplikowane - przez cały czas tylko jeden serwer odpowiada za określony obiekt, a gdy jest to wymagane, przekazuje ten obiekt na inny serwer. Obiekty są połączeniami klienta, które również zawierają obiekt kontrolny odtwarzacza. Odbywa się to jednak za pośrednictwem serwera głównego i jest omawiane między serwerami. Mamy więc do czynienia z dwoma rodzajami danych - inforacją bazy danych (do której odnosi się mój oryginalny post) oraz obiektami gry, które są tworzone w czasie wykonywania i przekazywane w wielo-serwerowym mmo. Żadne z nich nie powinno nigdy spaść w stan wyścigu ani zostać powielone na poziomie aplikacji.
Konrad K.

3

W odniesieniu do serwera gry: Powszechną strategią jest używanie wielu serwerów, z których każdy zarządza częścią świata gry. Każdy użytkownik zwykle musi tylko wiedzieć o tym, co się wokół niego dzieje, dlatego warto podzielić świat według lokalizacji. To niestety komplikuje się znacznie bardziej, gdy masz otwarty świat bez granic zamiast świata składającego się z zamkniętych stref i graczy teleportujących się między nimi. Gdy masz otwarty świat, potrzebujesz sposobu na płynne przenoszenie graczy między strefami oraz synchronizacji obszarów w pobliżu granic między serwerami. To podchwytliwy problem.

Jeśli chodzi o bazę danych: bazy danych SQL zwykle źle się skalują. Nie są przeznaczone do dystrybucji. Ale obecnie istnieje dość nowy trend w bazach danych NoSQL, takich jak MongoDB lub Cassandra, które zostały zaprojektowane do dystrybucji na wielu serwerach. Ułatwiają zwiększenie pojemności poprzez dodanie większej liczby serwerów. Dlaczego więc wszystkie duże gry się do nich nie przełączają? Bo:

  1. Bazy danych SQL istnieją od ponad 40 lat, te bazy danych NoSQL tylko przez kilka lat. Nie ma jeszcze dużego know-how, jak z nich korzystać najskuteczniej, a ich rozwój postępuje szybko. Na rynku jest wiele konkurencyjnych i całkowicie niekompatybilnych produktów i nie ma znaku, który z nich przetrwa, a który przestanie istnieć i zostanie wycofany za kilka lat. Większość dużych graczy preferuje znane niedociągnięcia SQLa przed nieznanym ryzykiem związanym z bazami danych NoSQL.
  2. Działają one zupełnie inaczej niż bazy danych SQL i wymagają ponownego przemyślenia całej strategii trwałości. Może to spowodować drastyczne zmiany w całej architekturze oprogramowania.

Kiedy Twój projekt jest już bardzo zaawansowany, przejście na inne rozwiązanie bazodanowe może być dużym ryzykiem i bardzo dużą inwestycją czasu i energii.


0

Nie. To niezwykle trudny obszar, który nie został jeszcze rozwiązany.


Czy może być jakieś „szablonowe” (nie jako „wzorce projektowe C ++) rozwiązanie? Istnieje wiele MMORPG.
Slav

2
Większość MMO jest wspierana przez absolutne katastrofy baz danych.

W szczególności MMO często mają bardzo różne podejścia do utrzymywania danych, które często działają akceptowalnie w przypadku własnego projektu gry, ale nie w przypadku innych projektów gier. Ponieważ projektowanie gry jest najważniejszą częścią, nie można odpowiednio określić strategii utrwalania danych i dystrybucji. (Które można by interpretować jako: „Zadaj bardziej szczegółowe pytanie, mówiąc nam, jakie masz dane, jak często się zmieniają i dlaczego uważasz, że chcesz rozdzielić jeden świat na wiele serwerów.”)
Kylotan

0

Wiem, że to stare, ale ....

Są dwa obszary, na których należy się skupić.

Musisz rozpowszechnić aplikację na kilku serwerach. Musisz rozpowszechnić bazę danych na kilku serwerach.

I musisz mieć redundancję dla obu.

Istnieje kilka rozwiązań tego typu. Farmville jest dobrym przykładem użycia MemSQL / Couchbase.


1
Dystrybucja bazy danych na wiele serwerów to z pewnością rozwiązany problem. Niestety zazwyczaj nie jest to ważny wymóg dla gier online, które ograniczają dostęp do bazy danych do minimum. Natomiast rozłożenie rzeczywistej rozgrywki na wiele serwerów nadal nie stanowi rozwiązania problemu.
Kylotan
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.