53
Krzysztof Sobczak, Software Engineer - Gwent Webservices

GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Embed Size (px)

Citation preview

Page 1: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Krzysztof Sobczak, Software Engineer - Gwent Webservices

Page 2: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Przetwarzanie rozproszone z wykorzystaniem

komunikacji asynchronicznej w grze online

Page 3: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)
Page 4: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Synchroniczna komunikacja HTTP

Page 6: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Synchroniczna komunikacja HTTP – przykład 1

Page 7: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Synchroniczna komunikacja HTTP – przykład 1

Page 8: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Synchroniczna komunikacja HTTP – przykład 2

Page 9: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Synchroniczna komunikacja HTTP – przykład 2

Page 10: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Asynchroniczna komunikacja

Page 11: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Asynchroniczna komunikacja - przykład

Page 12: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Na które powiadomienia czekać?

Page 13: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Łańcuch powiadomień

Page 14: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Łańcuch powiadomień

Page 15: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Technologie

Page 17: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)
Page 18: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

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)

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)

Duplikacja wiadomości

Page 22: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Duplikacja wiadomości

Page 23: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Ponawianie wiadomości

Page 24: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Kolejki w mikroserwisach

Page 25: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Kolejki w mikroserwisach

Page 26: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

System powiadomień

Page 28: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Case study: system powiadomień #1

Page 29: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Case study: system powiadomień #2

Page 31: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Case study: system powiadomień #2

Page 33: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Case study: system powiadomień #3

Page 35: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Problem wersjonowania

WERSJA ???

WERSJA 1

Page 37: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

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)

Kontrola sesji użytkownika - powiadomienia

Page 40: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Testy – dev

Page 41: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

Czy to wystarczy?>NIE<

Page 43: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

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)

Case study: matchmaking

Page 46: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Case study: matchmaking #1

Page 47: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Case study: matchmaking #2

Page 48: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Case study: matchmaking #3

Page 49: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

PYTANIA?

Page 51: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

Dołącz do nas!

Page 52: GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze online (PHPCon Poland 2016)

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)

DZIĘKUJĘ ZA UWAGĘ