GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon...
-
Upload
gogcom-dev-team -
Category
Technology
-
view
164 -
download
0
Transcript of GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon...
![Page 1: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/1.jpg)
Krzysztof Sobczak, Software Engineer - Gwent Webservices
![Page 2: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/2.jpg)
Przetwarzanie rozproszone z wykorzystaniem
komunikacji asynchronicznej w grze online
![Page 3: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/3.jpg)
![Page 4: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/4.jpg)
GWINT webservices – GOG
POKRYWAJĄ M.IN.:
• NAGRODY I OSIĄGNIĘCIA
• MIKROTRANSAKCJE
• ELEMENTY MULTIPLAYER
• PROFILE GRACZY
• KOLEKCJE KART
![Page 5: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/5.jpg)
Synchroniczna komunikacja HTTP
![Page 6: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/6.jpg)
Synchroniczna komunikacja HTTP – przykład 1
![Page 7: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/7.jpg)
Synchroniczna komunikacja HTTP – przykład 1
![Page 8: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/8.jpg)
Synchroniczna komunikacja HTTP – przykład 2
![Page 9: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/9.jpg)
Synchroniczna komunikacja HTTP – przykład 2
![Page 10: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/10.jpg)
Asynchroniczna komunikacja
![Page 11: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/11.jpg)
Asynchroniczna komunikacja - przykład
![Page 12: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/12.jpg)
Na które powiadomienia czekać?
![Page 13: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/13.jpg)
Łańcuch powiadomień
![Page 14: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/14.jpg)
Łańcuch powiadomień
![Page 15: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/15.jpg)
Trwałe powiadomienia
A JEŚLI NIE DOSTARCZYMY POWIADOMIENIA OD RAZU?
• Http API dla niedostarczonych powiadomień
• Stanowią mechanizm zastępczy dla usługi socket’owej
• Kopia powiadomień w trwałym miejscu
![Page 16: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/16.jpg)
Technologie
![Page 17: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/17.jpg)
![Page 18: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/18.jpg)
System kolejkowy
KLUCZOWE ASPEKTY
• Potwierdzanie produkcji / konsumpcji wiadomości
• Wystarczająca wydajność
• Trwałość wiadomości
• Skalowalność
![Page 19: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/19.jpg)
Rozszerzenie AMQP/php-amqplib/php-amqplib /pdezwart/php-amqp
• Biblioteka implementującaprotokół AMQP
• Interfejs PHP dla rozszerzenia librabbitmq
Napotkane problemy:
• Brak pełnego potwierdzaniawiadomości
• Słaba kontrola w przypadku problemów z RabbitMq
Napotkane problemy:
• Brak pełnego potwierdzaniawiadomości
• Słaba kontrola w przypadku problemów z RabbitMq
![Page 20: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/20.jpg)
Potwierdzanie / wydajność
TEST NA KLASTRZE 3 NODE’ÓW
BEZ POTWIERDZANIA
KLIENT W LOKALNEJ SIECI
11000 / sZ POTWIERDZANIEM
750 / s// w trakcie badania
możliwych optymalizacji
![Page 21: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/21.jpg)
Duplikacja wiadomości
![Page 22: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/22.jpg)
Duplikacja wiadomości
![Page 23: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/23.jpg)
Ponawianie wiadomości
![Page 24: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/24.jpg)
Kolejki w mikroserwisach
![Page 25: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/25.jpg)
Kolejki w mikroserwisach
![Page 26: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/26.jpg)
Federation
OFICJALNE ROZSZERZENIE RABBITMQ
• Umożliwia przenoszenie wiadomości pomiędzy usługami (klastry, vhosty)
• Wymaga tej samej nazwy exchange zdalnego i lokalnego
• Mapowanie exchange’y poprzez wyrażenie regularne
• Konfiguracja poprzez panel RabbitMq lub API
• Automatyczne odbudowywanie powiązań w przypadku awarii
![Page 27: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/27.jpg)
System powiadomień
![Page 28: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/28.jpg)
Case study: system powiadomień #1
![Page 29: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/29.jpg)
Case study: system powiadomień #1
• Kolejki tworzone po ustanowieniu połączenia z użytkownikiem
RABBITMQ
• Kolejka per użytkownik [~500k ]
• Kolejki usuwane po zerwaniu połączenia z użytkownikiem
PROBLEM?
• Restart Node.js oznacza ~500k kasowanych/tworzonych kolejek
• Za duże obciążenie Node.js w trakcie inicjalizacji• Przy więcej niż jednym node w klastrze restart potrafi trwać nawet 30min!
![Page 30: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/30.jpg)
Case study: system powiadomień #2
![Page 31: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/31.jpg)
Case study: system powiadomień #2
• Kolejka per użytkownik [~500k]
REDIS
• Wydajność 10k połączeń / s po restarcie klastra
• Publikacja do wszystkich podłączonych klientów
• Utrzymuje bez problemów kilkaset tysięcy połączeń
• Mechanizm Publish / Subscribe
• Konsumuje zdecydowanie mniej zasobów niż RabbitMq
![Page 32: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/32.jpg)
Case study: system powiadomień #2
![Page 33: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/33.jpg)
Case study: system powiadomień #2
• Na potrzeby kompresji bufor ok. 4K per połączenie (kilkaset tysięcy)
PROBLEM #2 Z NODE.JS
• Ogromne zużycie pamięci sięgające 20GB
• Wystarczyło wyłączyć kompresję (wiadomości i tak są małe)
• Wycieki pamięci widoczne po dniach/tygodniach
• Nadal duże obciążenie w przypadku restartu Redis
PROBLEM #1 Z NODE.JS
• Trudność debugowania aplikacji w środowisku produkcyjnym
![Page 34: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/34.jpg)
Case study: system powiadomień #3
![Page 35: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/35.jpg)
Case study: system powiadomień #3
• Brak nadmiarowego obciążenia po restarcie Redis
• Brak problemów z pamięcią i procesorem
• Okazał się przystępniejszy w rozwijaniu niż Node.js
GOLANG
• Prostsze debugowanie na produkcji (np. podgląd goroutines)
![Page 36: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/36.jpg)
Problem wersjonowania
WERSJA ???
WERSJA 1
![Page 37: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/37.jpg)
Problem wersjonowania
• Możliwe, że wiadomość została rozpoczęta po stronie serwerowej –wtedy brak informacji o wersji
• Propagacja informacji o wersji razem z wiadomością
• Możemy skorzystać z wersji ostatnio używanej przez użytkownika
ROZWIĄZANIE #2
ROZWIĄZANIE #1
![Page 38: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/38.jpg)
Kontrola sesji użytkownika
W JAKI SPOSÓB MOŻNA ZAPEWNIĆ,
ŻE W DANEJ CHWILI
UŻYTKOWNIK MA TYLKO JEDNĄ SESJĘ GRY?
![Page 39: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/39.jpg)
Kontrola sesji użytkownika - powiadomienia
![Page 40: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/40.jpg)
Testy – dev
![Page 41: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/41.jpg)
Testy – integracyjne
KILKA ŚRODOWISK TESTOWYCH
TESTY API POPRZEZ KLIENTA HTTP
KLIENT POWIADOMIEŃ
Odizolowane, umożliwiające weryfikację poprawnej integracji systemów
Niezależny klient odpytujący non-stop wszystkie usługi i według scenariuszy
Niezależny klient powiązany z klientem HTTP weryfikujący poprawność otrzymywanych powiadomień
![Page 42: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/42.jpg)
Czy to wystarczy?>NIE<
![Page 43: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/43.jpg)
Testy – symulacyjne
• Analogiczny klient, ale pozbawiony UI
• Nie można uruchomić ich zbyt wiele z racji na wymagane zasoby
• Klient gry wyposażony w UI realizuje określone scenariusze raportując błędne odpowiedzi webservices
• Można uruchomić ich dużo (bardzo) generując więcej losowych, trudnych do przewidzenia sytuacji
BOTY – BEZ UI
BOTY – Z UI
![Page 44: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/44.jpg)
Monitoring operacji asynchronicznych
CO MOŻEMY SPRAWDZAĆ
• Wyniki działania botów na produkcji
• Wypełnienie kolejek wiadomości
• Czas ostatniej przetworzonej wiadomości (per consumer)
• Metryki serwerowe (load, pamięć, zużycie dysk, IOPS)
• Metryki biznesowe np. Ilość przyznanych nagród w ciągu ostatniej doby
![Page 45: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/45.jpg)
Case study: matchmaking
![Page 46: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/46.jpg)
Case study: matchmaking #1
![Page 47: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/47.jpg)
Case study: matchmaking #2
![Page 48: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/48.jpg)
Case study: matchmaking #3
![Page 49: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/49.jpg)
Podsumowanie
• Poprawić niezawodność usług• Zwiększyć skalowalność aplikacji• Jeszcze bardziej odseparować mikroserwisy
ASYNCHRONICZNOŚĆ POZWOLIŁA NAM:
![Page 50: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/50.jpg)
PYTANIA?
![Page 51: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/51.jpg)
Dołącz do nas!
![Page 52: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/52.jpg)
1500+Gier w portfolio
5M+Unikalnych użytkowników / m-c
GOG.com – O NAS
Care about games. Care about gamers.
#1 Alternatywa dla Steam’a
![Page 53: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)](https://reader030.fdocument.pub/reader030/viewer/2022011721/5882be0b1a28abb2478b5539/html5/thumbnails/53.jpg)
DZIĘKUJĘ ZA UWAGĘ