SERWERY ip STALKER Clear Sky

Język:

ОТВЕТЫ@MAIL.RU: Skąd mam wiedzieć, że grałem serwer IP ...

architektura serwer gry online dla przykładu Skyforge

  • Tworzenia gier,
  • Firma Blog Mail.Ru Group,
  • programowanie
    Cześć, Habr! I Andrei Frolov, wiodący deweloper, pracując w Mail.ru na Next-Gen MMORPG Skyforge. Możesz przeczytać mój artykuł na temat architektury bazy danych w grach online. Dziś mam zamiar ujawnić tajemnice dotyczące konwerter Skyforge. Staram się powiedzieć jak najwięcej szczegółowo, wraz z przykładami, i wyjaśnić, dlaczego zdecydowano, że konkretnego projektu architektonicznego. Zgodnie z naszym serwerem, bez przesady, można napisać książkę, tak aby zachować w artykule, ja po prostu przejść przez głównych punktów.

    obraz

    Przegląd

    • Serwer - jest prawie dwa miliony linii kodu Java. Aby połączyć się z serwerem i wyświetlania piękne obrazy przy użyciu klienta napisany w C ++.
    • Przyczynić się do kodu serwera mają pięćdziesiąt programistów. Kod został napisany przez wiele lat najlepsi eksperci rosyjskiego „ortodoksyjnej” geymdeva. Zawiera wszystkie najbardziej udanych pomysłów z całego świata.
    • Do tej pory pisaliśmy około 5200 zautomatyzowanych testów jest dostosowane ciągłej integracji i testowania obciążenia za pomocą botów.
    • Serwer jest w stanie rozpocząć i działać w dziesiątki lub setki serwerów do obsługi setek tysięcy ludzi grać jednocześnie. Zdecydowaliśmy się zrezygnować z tradycyjnej technologii MMO shardirovaniya i uruchomienia wszystkich graczy w wielkim świecie.

    Pierwszym i najważniejszym rozwoju serwera zasada: klient w rękach wroga. Klient jest chroniony, ale w teorii, a to może włamać może rozszyfrować protokół typu klient-serwer. klient hacking może prowadzić do obejścia reguł gry, kody itp botovodstvu Te rzeczy zepsuć grę dla każdego. Aby tego uniknąć, musimy naśladować cały świat gry z wszystkich zasad gry na serwerze i kliencie używać tylko do wyświetlania piękny obraz. Ponadto, klient powinien być sprawdzany za włamania, śledzenie podejrzanego zachowania, itd.

    architektura serwis

    Jedną z głównych cech projektu polega na tym, że nie wiemy ile mamy graczy. Być może tylko jeden - sam deweloper, a może 100 tysięcy w tym samym czasie. Dlatego, serwer musi być w stanie uruchomić w małej konfiguracji na laptopie, i rozciągnąć w miarę potrzeby przez dziesiątki i setki potężnych serwerach.

    Drugą cechą jest to, że na początku rozwoju nie mieliśmy pojęcia o tym, co będzie nasza gra, co będzie to zwłaszcza usług itd Struktura serwer powinien być jak najbardziej elastyczny jeśli chodzi o dodawanie nowych usług i funkcji.

    Trzeci duży problem - to wielowątkowości. Jak wiesz, najlepszym sposobem radzenia sobie z wielowątkowości - jest, aby tego uniknąć. Deadlock, livelock, blokada rywalizacji, i inne kwestie bliskie sercu programatorem można uniknąć, jeżeli architektura serwer uwolni cię od konieczności ręcznego synchronizować wątki. Idealnie, programista musi napisać w ogóle prosty jednowątkowego kod i nie trzeba się martwić o takie rzeczy.

    Stąd nasza uniwersalna konstrukcja serwera urodził, który jest używany w Skyforge:

    • Jest tam basen z serwerów fizycznych, które prowadzą grę. Ten zestaw serwerów i nasz serwer aplikacji, który działa na nich, o nazwie domeny.
    • Każdy serwer uruchamia aplikację serwera (JVM), w odniesieniu do roli. Role są różne: serwer konto, mechanika gry, czat, itd. Każda rola nabiera dużego kawałka funkcjonalności. Niektóre role występują w liczbie pojedynczej, niektóre uruchomić kilka kopii.
    • Rola składa się z zestawu usług. Service - jest to zwykle strumień (gwint), który jest zaangażowany w ich własnym, specyficznym dla niego zadania. Przykładem może być usługa usługi autoryzacji, nazwy usługowa w zakresie rezerwacji, równoważenia obciążenia, itd. Każda usługa nie wie nic o fizycznej lokalizacji innych usług znać. Mogą one być blisko, ale może być na innej maszynie fizycznej. Usługi interakcji za pośrednictwem systemu komunikacyjnego, który ukrywa je przed tego rodzaju szczegóły.
    • Każda usługa składa się z zestawu modułów. Moduł - „fragment funkcjonalności”, który ma metodę kleszczy (). Przykładem może być moduł moduł statystyk, moduł wykonanie transakcji moduł synchronizacji czasu. Wszystkie prace usługi polega na tym, że w nieskończonej pętli z kolei powołują się kleszcza () metoda w swoich modułach. Jeden taki cykl nazywa się „frame server”. Wierzymy, że dobry wskaźnik, jeśli ramka serwer waha się od 3 do 20 ms.
    • Cała konstrukcja jest opisany w plikach XML. System start-up powinien właśnie tytułową rolę „karmić”. Dowiaduje odpowiedni plik, uruchomić wszystkie niezbędne usługi i dać im listy modułów. Moduły sami będą tworzone za pomocą java refleksji.

    W ten sposób możemy uruchomić jako „serwer lokalny”, czyli wszystko, czego potrzebujesz, a może złamać na wiele ról serwera - serwer konta, serwer towaru, mechaniki gry, itp - i uruchomić go na dziesiątki różnych serwerach fizycznych. Struktura jest niezwykle elastyczny i wygodny, sugeruję poważne spojrzenie na niego.

    podstawowe usługi

    Istnieje pewien zestaw usług, który ma główny ciężar gry. Każdy serwer musi być zdolny do skalowania. Idealnie - do nieskończoności. Niestety, pisanie serwerów tak, że są skalowane, nie jest łatwym zadaniem. Zaczęliśmy więc od tego, że zrobiłem podstawowe usługi skalowalne, a każdy dodatkowy drobiazg, że nie ponosi główny ciężar, w lewo na później. Jeśli mamy dużo użytkowników, a będziemy musieli poprawić, aby zapewnić skalowalność.

    • Usługa konto. Odpowiedzialny za wydawanie zezwoleń i przyłączania nowych klientów.
    • Serwer z mechaniką gry. Tutaj jest, w rzeczywistości, sama gra. Po przejściu uwierzytelniania klienta łączy się tutaj i tutaj odgrywa. Z innych usług klient nie oddziałują bezpośrednio. Usługi te mogą i powinny być prowadzone kilkadziesiąt lub nawet kilkaset. To właśnie te usługi ponoszą główny ciężar.
    • Usługi bazy danych. Usługi te wykonywać operacje na danych postaci w grze, ich przedmioty, pieniądze, postępu rozwoju. Biegną zwykle kilka sztuk. Aby uzyskać więcej informacji na temat architektury bazy danych można znaleźć w moim poprzednim raporcie. (Habrahabr.ru/company/mailru/blog/182088)
    • Czat. Jest zaangażowany w routingu wiadomości błyskawiczne pomiędzy użytkownikami.
    • Wszystkie inne usługi. Kilkadziesiąt, a oni zwykle nie powodują poważnych obciążeń, a zatem nie wymagają osobnych serwerów.

    sieć

    Słowo „sieć”, mam na myśli system dostarczania wiadomości z jednego serwisu do drugiego lub z jednego obiektu do drugiego. Historycznie rzecz biorąc, że mamy tylko dwa takie systemy. Jednym z nich jest oparta na wiadomościach. Drugi system opiera się na pilocie zdalnego wywołania procedury (RPC). W Skyforge system komunikacji jest używany w ramach usługi mechaniki gry wysłać jakąś wiadomość z awatara do tłumu, jak również dla klienta i serwera komunikacyjnego. RPC jest używany do komunikacji między służbami.

    komunikaty

    Wszystkie firmy, które chcą, aby wysyłać i odbierać wiadomości nazywane są abonenci. Każdy abonent jest zarejestrowany we wspólnym katalogu i unikalny identyfikator - adres. Każdy, kto chce wysłać wiadomość do dowolnego abonenta należy podać adres „jak” i „gdzie”. Silnik sieć wie, gdzie znajduje się użytkownik i dostarcza mu wiadomość. Komunikat - Java-obiekt, który ma metodę run (). Po wysłaniu obiekt jest w odcinkach, przybywa do abonenta docelowego, nie jest rozszeregować, a następnie wywołuje run () metoda abonenta docelowego.

    Takie podejście jest bardzo wygodne, ponieważ pozwala na wdrożenie prostych poleceń „strajk” typ „odblokować problem”, „aby uruchomić kulę ognia.” Wszystko to logika jest na zewnątrz obiektu, na którym jest wykonywana czynność. Dużą wadą tego podejścia jest to, że jeśli logika polecenie wymaga żadnego kodu do wielu odbiorców, musimy wykonać kilka wiadomości, które zostaną wysłane do siebie wzdłuż łańcucha. Logika jest podzielone na kilka klas, a rozmowy są często dość długie i trudne do rozwikłania.

    Czytaj więcej:   Nie ładuj aplikacji VKontakte
    RPC

    Remote Procedure Call lub RPC ukazał się rozwiązać problem rozmów.
    Podstawową ideą jest wykorzystanie wielozadaniowości (współprogram włókna). Ci, którzy nie są zaznajomieni z tym pojęciem, dla zrozumienia tematu proponuję zajrzeć do „Wikipedia”. en.wikipedia.org/wiki/Coroutine.
    Usługa, która chce być w stanie spowodować zdalne wywołanie procedury jest wdrożenie specjalnego interfejsu i zarejestrować się w specjalnym katalogu. Następnie każdy może poprosić dyrektora dać mu interfejs usługi i katalog zwróci szczególną opakowanie na służbie. RPC wywołać usług wyłącznie wewnątrz włókno (coroutin), to znaczy szczególny kontekst wykonanie, które mogą zostać przerwane i wznowione w punktach nieciągłości. Podczas rozmowy telefonicznej metody otoki wyśle wywołań RPC do zdalnego serwisu, przerwać aktualną Fiber czekając na odpowiedź i zwraca wynik, gdy zdalny serwer odpowiada.

    W ten sposób możemy skupić logiki do jednej metody, a nie rozmazane go na setki wiadomości. Kod jest znacznie uproszczone, jest możliwe, aby napisać kilka przedmiotów, a nie pod kątem wysyłania wiadomości pod względem wywołań funkcji. Ale istnieją problemy z pozory wielowątkowości, ponieważ po powrocie ze zdalnego wywołania, środowisko może już zmienić. W ogóle, to podejście jest bardzo przydatna, gdy nie jest ograniczony interfejs usługi od kilkunastu metod. Gdy metody stają się znacznie lepiej interfejs jest podzielony na kilka.

    Dowiedz się więcej o naszej realizacja Fiber można znaleźć w wykładzie Sergei Zagurskiy (www.youtube.com/watch?v=YWLHELcvNbE).

    serializacji

    Aby pracować z nami wysyłać wiadomości systemowe i zdalne wywołanie procedury, musimy protokół typu klient-serwer i sposób do serializacji / deserializacji obiektów. Przypomnę, że mamy potrzebę wysyłania komend i danych od klienta do serwera, to znaczy, od C ++, Java i vice versa. Aby to zrobić, możemy wygenerować Java klasy kopii w C ++, a także generowanie metod serializacji i deserializacji obiektów w strumieniu bajtów. Kod serializacji jest osadzony bezpośrednio w obrębie grupy i odnosi się do pola klasy bezpośrednio. W ten sposób serwer nie tracić czasu procesora z pominięciem klasy przy użyciu odbicia. Wszystko to możemy wygenerować stosując samopisnogo plug-in dla IntelliJ IDEA. Protokół Vnutriserverny do komunikacji między usługami jest całkowicie podobny do protokołu klient-serwer.

    Kiedy serializacji klasy w strumieniu bajtów, pierwsze pisemne klasa id, wówczas pola danych z tej klasy. Z drugiej id strona odczytu, odpowiednia klasa jest wybrany i jest nazywany specjalnego konstruktora, który przywraca klasę ze strumienia bajtów.

    mechanika gry

    Główną usługą, która będzie interesujące dla ciebie, to game mechaników serwisowych. To miejsce, gdzie cały kod jest wykonywany bezpośrednio związane z grą, to gdzie cała symulowany świat gry, latające kule ognia i „rob Korowai”.

    Czytaj więcej:   strona z przyciskiem muzyki
    Mapy i równoważenie obciążenia

    Serwery z mechaniką gry są karty, na których, w rzeczywistości, są zawodnicy, mobów i jest cała zabawa. Każda karta ma limit na liczbę graczy, którzy mogą być na nim. Na przykład, limit może być równa jednej osobistej przygody, 10-30 do zajęć grupowych i 250 dla dużych mapach. Co się stanie, jeśli karta chce uderzyć innego gracza, gdy osiągnięta zostanie granica? Wtedy będzie stworzenie innej kopii tej samej karty. Gracze z tych kart nie będą widzieć się nawzajem, nie kolidują ze sobą. Ie w każdej grze mieście może być tysiące ludzi, ale nie będą zatłoczone. Taki sposób organizowania graczy zwane „kanały”.

    Odpowiedzialny za stworzenie mapy Centralne Biuro „karty wyrównoważające”, który dystrybuuje karty służb mechaniki gry, w zależności od populacji, obciążenia i innych powodów magicznych, starając się utrzymać równomierny rozkład obciążenia i gęstość normalnego odtwarzania, więc nie nudzili.

    Na każdym serwerze, mechanika gry załadowany przepustowość o kartę, kolizje i inne tego typu rzeczy. Gdy gracz lub tłum próbuje przenieść do dowolnego punktu, serwer oblicza, czy gracz jest się tam dostać, jeśli próbuje schiterit i przejść przez ścianę. Gdy gracz próbuje rzucić kulę ognia na wroga, na tych samych informacji serwer oczekuje, jeśli wróg widzi odtwarzacza i nie ma żadnych przeszkód na jego drodze.

    Awatary i moby

    Avatar - to postać, która jest kontrolowana przez gracza, mob - potwór, który zabija gracza. Jest to bardzo różne, ale często jest to bardzo podobny charakter. I tłum, a awatar może chodzić na mapie, mają zdrowie, mogą używać czarów, itp Tekst kontroluje tylko odtwarzacz, gdy mob ma mózg. Ponadto karty mają wszelkiego rodzaju pni, roślin i innych podmiotów internetowych. Często konieczne jest, aby zrobić niektóre z jego funkcjonalności i przylgnąć do różnych podmiotów. Do tych celów wykorzystujemy podejście komponentu, gromadząc istotę gry z zestawu funkcjonalności. opiszę przykład. Powiedzmy, że gracz i mob jest wskaźnikiem zdrowia. W tym przypadku wykonujemy element „zdrowie” jako odrębnej klasy Java, które opisują, w jaki sposób zachowuje zdrowia: może zmniejszać, aby odzyskać to, co ma liczniki itp Potem wystarczy umieścić wszystkie funkcje o szczególnym charakterze HashMap wewnątrz i zabrać ją z konieczności. Takie składniki mają, istnieją setki, zebrali połowę mechaniki gry.

    Ponieważ serwer aplikacji jest bardzo złożona, nieuniknione występowanie błędów. Musimy zrobić tak, że występowanie błędów, nawet bez leczenia NullPointerException, nie doprowadziło do awarii serwera. Można po prostu zalogirovat błąd i przejść, ale jeśli błąd pojawia się w środku niektórych długich krokach ponad awatara, awatar może być w zniszczonym stanie i niespójności. Tutaj mamy poparcie koncepcji zwanej „locale”. Locale - to jest kontekst, w którym obiekty mogą odnosić się do siebie. Przedmioty z jednej lokalizacji nie może odnosić się do obiektów innego. Jeśli wersję językową nieobsłużonego wyjątkiem padnie, narodowe jest usuwany całkowicie. Awatary, potwory i inne podmioty są lokalizacje są usuwane całkowicie i nie może zawierać odnośniki do innych awatarów i potworów. Dlatego wszystkie interakcje pomiędzy awatarów i mobów przechodzących przez system wiadomości, mimo że są one ze sobą na tej samej maszynie i teoretycznie mógłby posiadać każdy inny bezpośredni związek.

    replikacja

    Aby symulować świat gry jest konieczne nie tylko na serwerze, ale również częściowo na kliencie. Na przykład, klient musi widzieć innych graczy i potworów, które są blisko niego. Z tego mechanizmu replikacji jest używany klient-serwer, gdy klient jest wysyłany do serwera aktualizacji otaczających świat gry. Odbywa się to za pomocą generatora kodu, który integruje wysyłanie aktualizacji Java ustawiaczy obiektów serwerowych. Gracze tworzą krąg wokół pewnego promienia, a jeśli ktoś, tak jak innego awatara, mieści się w tym przedziale, to zaczyna być replikowane do klienta. Ponieważ replikacja jest podstawowym problemem. Jeśli w jednym miejscu filary awatarów N, następnie każdy z nich będzie musiał wysłać repliki N. Zatem istnieje zależność kwadratową, która ogranicza liczbę awatarów, które mogą gromadzą się w jednym miejscu. To właśnie z powodu tej podstawowej kwadratowych klientami MMO hamować w stolicach. Możemy uniknąć tego problemu poprzez ograniczenie liczby graczy na mapie, a następnie ich dystrybucji za pośrednictwem kanałów.

    System zasobów

    W grze istnieją setki i tysiące czary, przedmioty, zadania i innych podobnych instytucji. Jak zapewne domyślacie, programiści nie pisać wszystkie setki questów, czy twórcy gry. Programista Java rozwija klasy zadań i opisy wszystkich questów do ich logicznych, zadań i tekstów zawartych w plikach XML zwanych zasobów. Po uruchomieniu serwera, możemy załadować tych zasobów, a oparte na nich zbierać java-zajęcia z opisem świata. Zajęcia te mogą być zmuszone do korzystania z serwera. W przybliżeniu taki sam system istnieje po stronie klienta, ale nie są zasoby są ładowane z plików XML i wystarczy wczytać wcześniej przygotowaną „kawałek pamięci”, zawierające wszystkie niezbędne przedmioty i powiązań między nimi. Pliki zasobów mamy kilkaset tysięcy, ale ich obciążenia na serwerze trwa około dwóch minut. Na kliencie, to wszystko jest ładowane w kilka sekund. System jest bardzo fantazyjne obsługuje funkcje takie jak prototypów i dziedziczenia i zagnieżdżonych uchwyty itp Na szczycie systemu zasobów stworzyliśmy wyspecjalizowane programy dla kart edycyjnych i innych podmiotów do gier.

    Serwer w akcji

    Przejdźmy teraz pokazują przykłady kilku scenariuszy, w jaki sposób cały system w działaniu.

    Czytaj więcej:   jak w filmie STUDIO WINDOWS LIVE nakładanie obrazów w filmie
    zabić psa

    Klasyczne testy, które zawsze trzymać jeśli poważnie zmieniona infrastruktura i chcesz sprawdzić, czy wszystko działa nazywany jest „Zabić psa.” Musisz iść do klienta do serwera i tam zabić każdą istotę. Test ten obejmuje prawie wszystkie z serwerem rozjaśnionych i doskonały przykład, aby dodać do siebie wszystkie powyższe razem. Przeanalizujmy punkty, jak i to, co się dzieje z zabójstwem nieszczęsnego psa. Oczywiście, niektóre kroki są uproszczone, ale to nie jest krytyczna, aby zrozumieć.

    • Klient wysyła do serwera komunikat konto: „Chcę dostać w grze.”
    • Serwer konto zapytań do bazy danych, autoryzuje i żąda karty balanser na którym gracz był ostatni raz.
    • Balancer wybiera kartę z już załadowany lub utworzyć nowy na najmniej ruchliwej serwerze, mechanice gry.
    • Klient łączy się mechaniką, gdzie karta została stworzone dla niego. Tak długo, jak jest on podłączony, jego awatar jest pobierany do niego.
    • Serwer rozpoczyna replikację wszystkich obiektów wokół awatara na kliencie. Klient zwraca elegancki obraz i wysyła polecenia do serwera, który wysyła gracza.
    • Gracz rozpoczyna swój bieg na mapie, a serwer przenosi go na całym świecie i replikuje zmiany rzeczywistości. Gracz znajdzie żadnej tłum i naciska „Hit”.
    • Zespół „wpływ” przybywa na serwerze, serwer sprawdza, że ​​strajk jest możliwe, a tłuszcza wysłał wiadomość do zranić.
    • Zespół „szkoda przyczyna” jest spełniony w mob, oblicza wszystkie opór i inne tego typu rzeczy, to bierze funkcjonalność „zdrowie” i zapisuje się pewną liczbę.
    • Klient wysyła odpowiedź z potwierdzeniem klient DPS rysuje rzutu.
    skalowanie

    Chodźmy na drugą stronę i zobaczyć, jak serwer zachowuje się pod obciążeniem.

    • 0 klientów. Jeśli serwer jest pusty, możliwe jest, aby uruchomić jeden wniosek o minimalnej konfiguracji i bez kart. Na serwerze nie ma żadnej aktywności, a przez większość czasu jest bezczynny.
    • 1 klient. Dla jednego klienta musi stworzyć mapę, moby, obiektów serwerów, które zużywają pamięć i czas procesora dla jego życia.
    • 500 klientów. 500 klienci zazwyczaj mają sporo czasu procesora do jednego komputerów osobistych nie mają wystarczająco dużo dla serwera. Realm trzeba uruchamiać na wielu komputerach lub na mocniejszych serwerów.
    • 10.000 klientów. 10000 klienci są wymagający wielu serwerów. Ponieważ duża część ciężaru przypada na mechanice gry, trzeba uruchomić dodatkowe usługi sferę z mechaniką gry.
    • 100.000 klientów. 100000 jednoczesnych graczy, więcej niż połowa serwery są zajęte mechanika gier.
    • Klienci więcej niż żelazo. Jeśli nagle gracze będą jeszcze większe, a żelazo nagle zakończyć, trzeba ograniczyć wprowadzanie ludzi do gry, natomiast wychowywanie nowych serwerów. Aby to zrobić, nie ma kolejek przy wejściu, co zmusza graczy czekać, aż serwer jest gotowy na ich przyjęcie. To wszystko sprawia, że ​​podczas gdy jedna sfera nie może mieć więcej graczy niż jesteśmy w stanie zaakceptować. Z kolei gracze mogą rozpocząć się w, a jeśli z powodu błędu lub nawet jakiegokolwiek powodu, serwer nagle stała się wolniejsza pewien próg. Lepiej zrobić dopuszczalny usługi dla ograniczonej liczby klientów niż wpaść na zawsze.

    wniosek

    Mam nadzieję, że nasze doświadczenie pomoże Ci zrozumieć, jak nowoczesne serwery gry są uruchomione, i tworzyć własne, jeśli chodzi o to.
    Aby lepiej zrozumieć inne aspekty rozwoju gry, polecam Ci czytać artykuły kolegom.

    • Zakaz poboru wielozadaniowość Java www.youtube.com/watch?v=YWLHELcvNbE
    • Badanie obciążenia w Skyforge lub botami - Medycy habrahabr.ru/company/mailru/blog/193452 serwer habrahabr.ru/company/mailru/blog/191378
    • Bazy danych w grach online. Z Allods Online do Skyforge habrahabr.ru/company/mailru/blog/182088
    • Pozostałe artykuły allodsteam.ru/#posts

    I oczywiście, nagrywanie na zamkniętych beta testów. sf.mail.ru

    Ciekawe statystyki

    Statystyki dotyczące linii kodu. Statystyki obejmują jedynie serwer.

    Autorzy zebrali od komentarzach do kodu.

    PS: Jak zwykle, odpowiedź na wszystkie pytania w komentarzach.

    Wybierz swój język

    polskiangielski niemiecki hiszpański francuski włoski portugalski turecki arabski ukraiński szwedzki węgierski bułgarski estoński Chiński (uproszczony) wietnamski rumuński tajski słoweński słowacki serbski malajski norweski łotewski litewski koreański japoński indonezyjski hinduski hebrajski fiński grecki holenderski Czech duński chorwacki Chiński (tradycyjny) Filipińska urdu Azeybardzhansky ormiański Białoruski bengalski gruziński kazachski Kataloński mongolski rosyjski Tadzhitsky Tamil'skij telugu Uzbetsky


    Dodaj komentarz

    Twój e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *