Architektura

Czas na drugi odcinek „gry od kuchni”. W poprzednim pokazaliśmy jak technologiczne fundamenty mogą pozytywnie wpłynąć na rozwój. Teraz czas pokazać jak architektura całego systemu może ulepszyć rozgrywkę.

Gry MMO mają fundamentalny problem – skalowanie. W idealnym świecie takie gry potrafiłyby obsłużyć dowolną ilość graczy zachowując płynność. Niestety, nasz świat nie jest idealny i większość tytułów wykazuje prędzej czy później wykazuje problemy. Nagły napływ graczy może powodować coraz wolniejsze odpowiedzi od serwera i większą ilość błędów. Można sobie z tym poradzić na kilka sposobów i każdy jest stosowany w różnych grach.

Najpopularniejsze rozwiązania to:

  • prywatne instancje – gracze są dzieleni na grupy, które dostają własną „kopię” świata (najbardziej popularne w grach opartych na izolowanych rozgrywkach, np. FPS)
  • sharding – dzielenie ogółu graczy na większe grupy, gdzie każda grupa jest przypisana do danego serwera (każde MMO, które ma wybór świata, stosuje tę technikę, np. World of Warcraft)
  • skalowalny stały świat – wszyscy grają w tym samym świecie, który powinien się skalować do ich liczby, np. EVE Online

Jak to wygląda w VA? Zależy o której wersji mówimy.

Prehistoria

Stara wersja sprzed lat korzystała z shardingu – przy logowaniu każdy musiał wybrać świat. Takie podejście miało pewne problemy – nie dało się skalować świata ani w górę, ani w dół. Dodatkowo, nikt nie mógł w żaden sposób nawiązać interakcji z nikim z innych światów. Szczęśliwie, udało nam się wtedy urozmaicić rozgrywkę przez zmiany niektórych zasad gry między światami. Dzięki temu były one podobne ale ostatecznie różne i nie czuć było sztucznego podziału.

W dzisiejszych czasach, system taki ostatecznie jest zbyt kłopotliwy i zbyt ograniczający graczy, żeby go zastosować.

Teraźniejszość

W aktualnej wersji postanowiliśmy na jeden dynamiczny świat. Wszyscy gracze będą grali ze sobą, a gra będzie się skalowała do ich liczby. Wymagało to znacznych zmian w samej architekturze backendu i odejścia od typowego podejścia serwer = świat.

Cała gra składa się z wielu działających równolegle w chmurze usług, które same mogą mieć uruchomione wiele instancji. Jest to podejście podobne do typowych mikroserwisów ale słowo „mikro” jest tu dość umowne – ze względu na naturę aplikacji, niektóre z nich są dość spore. Niektóre usługi odpowiadają np. za obliczanie aktualnego stanu gracza, inne za wysyłanie wiadomości, a inne za handel. Takie podejście pozwala na wyeliminowanie wąskiego gardła w grze. Przykładowo, jeśli wysyłanie wiadomości spowalnia grę, wystarczy zwiększyć liczbę działających instancji odpowiedzialnych za wysyłkę i wszystko powinno wrócić do normy. Jednocześnie pozostałe aspekty gry będą działały bez spadku wydajności. Dzięki temu wszyscy zyskują – gracze mają płynniejszą rozgrywkę, a my mamy dokładniejszą kontrolę nad światem gry.

Oczywiście, wszystko musi się za sobą komunikować i mieć miejsce do zapisu danych. W VA odpowiada za to Apache Kafka, Cassandra i Elasticsearch.

Cassandra jako baza danych oferuje wysoką wydajność i dynamiczną skalowalność. Tak samo z Kafką, jako systemem wymiany wiadomości między usługami. Elasticsearch, z kolei, odpowiada za szybkie wyszukiwanie dowolnych rzeczy – od innych graczy po fragmentach nicków, po oferty na rynku. Całość jest schowana w wewnętrznej sieci chmury, a komunikacja z klientami odbywa się przez specjalne proxy, które odpowiada też za zabezpieczenia.

OK ale co to dla mnie oznacza?

Benefity z takiego podejścia nie tylko są widoczne dla nas. Dzięki bardzo dokładnej kontroli nad każdym aspektem gry, cały system powinien być bardziej stabilny i dać (w teorii) możliwość skalowania w nieskończoność. A to oznacza przyjemniejszą rozgrywkę dla wszystkich, bez sztucznych ograniczeń świata. Gry MMO są z natury bardzo skomplikowane wewnętrznie, a taka architektura komplikuje je jeszcze bardziej. Ostateczny wynik powinien jednak wynagrodzić całą zainwestowaną pracę.

Dodaj komentarz