Zastrzeżenie: moje doświadczenie w programowaniu gier opiera się na grach dla pojedynczego gracza po stronie klienta, ale mam doświadczenie w aplikacjach internetowych (szczególnie na stosie Microsoft), więc z tego powodu pochodzę z tej odpowiedzi, czuję, że tyle by zastosuj, ale bez faktycznego przetestowania prawdziwego serwera gry trudno jest powiedzieć, jak będzie on obowiązywał, ale proszę bardzo. Wiedz o tym: nie wdrożyłem serwera gier, tylko aplikacje internetowe.
Sugerowałbym podejście dwupoziomowe. Warstwa bazy danych i warstwa „aplikacji”; z trzecim poziomem prezentacji (twoim klientem).
Relacyjne bazy danych świetnie sprawdzają się w wyszukiwaniu danych i są przyzwoite w pisaniu danych. Kluczem jest szeregowanie zapisów w bazie danych na porcje o zarządzalnym rozmiarze, które klaster może obsłużyć. Bardziej zaawansowane wersje (Centrum danych / Przedsiębiorstwo) programu SQL Server obsługują klastrowanie i replikację. Zacznę od zbudowania małego klastra i uruchomienia kilku zapytań, aby zobaczyć, jak to działa.
W warstwie aplikacji, jeśli wykonujesz „podział na strefy” lub coś podobnego, prawdopodobnie możesz uciec bez konfigurowania klastrów i po prostu skonfigurować serwer dla strefy. Jeśli twoje strefy stają się zbyt duże, możesz ustawić klaster dla każdej strefy.
Będziesz chciał zbudować proces serializacji do wysyłania danych z poziomu aplikacji -> poziom bazy danych. Kluczem do sukcesu jest prowadzenie wielu poziomów serializacji. Coś takiego :
- Poziom 1: Zapisz w DB co X sekund, zawiera dane krytyczne:
- Zdrowie gracza
- Przedmioty gracza / Przetworniki
- Poziom 2: Zapisz do DB co 2X sekund, zawiera średnie dane:
- Lokalizacje graczy
- Lokalizacje NPC
- Poziom 3: Wszystko inne, tak rzadko, jak to możliwe
Dzięki temu twoje zapisy będą spójne i przewidywalne, w zależności od charakteru twojej gry, możesz mieć rzadkie zapisy w bazie danych. Kluczem do sukcesu jest uświadomienie sobie, że jeśli serwer aplikacji ulegnie awarii, będziesz musiał wrócić do trybu online ze stanu w bazie danych, więc serializowanie zapasów odtwarzacza co 90 minut może go zdenerwować.
Aby odczytać dane, należy załadować jak najwięcej do pamięci w warstwie aplikacji, jak to możliwe, a następnie upewnić się, że cały kod korzysta z tej puli pamięci, w tle można synchronizować pulę pamięci z bazą danych. Jak zauważa Joe, będą chwile, kiedy będziesz potrzebować transakcji w czasie rzeczywistym. Serializując większość zapisów, powinieneś nadal mieć wystarczającą liczbę operacji we / wy w bazie danych, aby w razie potrzeby przeprowadzać transakcje w czasie rzeczywistym, zakładając wystarczający sprzęt na serwerze / klastrze bazy danych.