SlideShare a Scribd company logo
1 of 53
Download to read offline
Krzysztof Sobczak, Software Engineer - Gwent Webservices
Przetwarzanie rozproszone z wykorzystaniem
komunikacji asynchronicznej w grze online
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
Synchroniczna komunikacja HTTP
Synchroniczna komunikacja HTTP – przykład 1
Synchroniczna komunikacja HTTP – przykład 1
Synchroniczna komunikacja HTTP – przykład 2
Synchroniczna komunikacja HTTP – przykład 2
Asynchroniczna komunikacja
Asynchroniczna komunikacja - przykład
Na które powiadomienia czekać?
Łańcuch powiadomień
Łańcuch powiadomień
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
Technologie
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ść
Rozszerzenie AMQP
/php-amqplib/php-amqplib /pdezwart/php-amqp
• Biblioteka implementująca
protokół AMQP
• Interfejs PHP dla
rozszerzenia librabbitmq
Napotkane problemy:
• Brak pełnego potwierdzania
wiadomości
• Słaba kontrola w przypadku
problemów z RabbitMq
Napotkane problemy:
• Brak pełnego potwierdzania
wiadomości
• Słaba kontrola w przypadku
problemów z RabbitMq
Potwierdzanie / wydajność
TEST NA KLASTRZE 3 NODE’ÓW
BEZ POTWIERDZANIA
KLIENT W LOKALNEJ SIECI
11000 / s
Z POTWIERDZANIEM
750 / s
// w trakcie badania
możliwych optymalizacji
Duplikacja wiadomości
Duplikacja wiadomości
Ponawianie wiadomości
Kolejki w mikroserwisach
Kolejki w mikroserwisach
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
System powiadomień
Case study: system powiadomień #1
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!
Case study: system powiadomień #2
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
Case study: system powiadomień #2
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
Case study: system powiadomień #3
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)
Problem wersjonowania
WERSJA ???
WERSJA 1
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
Kontrola sesji użytkownika
W JAKI SPOSÓB MOŻNA ZAPEWNIĆ,
ŻE W DANEJ CHWILI
UŻYTKOWNIK MA TYLKO JEDNĄ SESJĘ GRY?
Kontrola sesji użytkownika - powiadomienia
Testy – dev
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ń
Czy to wystarczy?
>NIE<
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
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
Case study: matchmaking
Case study: matchmaking #1
Case study: matchmaking #2
Case study: matchmaking #3
Podsumowanie
• Poprawić niezawodność usług
• Zwiększyć skalowalność aplikacji
• Jeszcze bardziej odseparować mikroserwisy
ASYNCHRONICZNOŚĆ POZWOLIŁA NAM:
PYTANIA?
Dołącz do nas!
1500+Gier w portfolio
5M+Unikalnych użytkowników / m-c
GOG.com – O NAS
Care about games. Care about gamers.
#1Alternatywa dla Steam’a
DZIĘKUJĘ ZA UWAGĘ

More Related Content

Featured

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Featured (20)

AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 

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

Editor's Notes

  1. Jako GOG.com jesteśmy firmą działającą w przemyśle growym
  2. Ogólny model komunikacji synchronicznej HTTP
  3. Przykład dobrego zastosowania. Gracz wchodzi w Multiplayer Potrzebujemy trochę informacji o nim, więc pytamy zdalną usługę Jakie mogą być problemy z usługą ”2”? 1) Może być niewydajne samo częste odpytywanie Możemy trzymać lokalny cache (z soft + hard ttl) 2) Może w ogóle nie istnieć powiązany użytkownik Naturalnie to błąd ze strony gry 3) Usługa może ”leżeć”. Jeśli leży to nie wiemy nawet czy odpowiedni użytkownik istnieje, sprawdzamy lokalny cache – jeśli jest to spoko, jak nie to: Zwracamy błąd (pewnie z puli 5xx) Przyjmujemy jakieś uśrednione parametry matchowania
  4. Przykład dobrego zastosowania. Gracz wchodzi w Multiplayer Potrzebujemy trochę informacji o nim, więc pytamy zdalną usługę Jakie mogą być problemy z usługą ”2”? 1) Może być niewydajne samo częste odpytywanie Możemy trzymać lokalny cache (z soft + hard ttl) 2) Może w ogóle nie istnieć powiązany użytkownik Naturalnie to błąd ze strony gry 3) Usługa może ”leżeć”. Jeśli leży to nie wiemy nawet czy odpowiedni użytkownik istnieje, sprawdzamy lokalny cache – jeśli jest to spoko, jak nie to: Zwracamy błąd (pewnie z puli 5xx) Przyjmujemy jakieś uśrednione parametry matchowania
  5. Przykład złego zastosowania. Server gry chce zgłosić koniec rozgrywki do pewnej usługi. Przetwarzamy żądanie, a potem chcemy spowodować: 1) aktualizację profilu użytkownika pod kątem zmiany doświadczenia, levelu itd. 2) Zdecydować o ewentualnych przynależnych nagrodach i dostarczyć je Jakie mogą być problemy? Jeśli dowolna z usług 2 i 3 nie działa to nie możemy poprawnie zakończyć gry Możliwe, że niesprawność usługi 2 powoduje złe decyzje ze strony usługi 3 Request jest długi, bo zawiera dużo logiki, co zajmuje procesy PHP i tym samym blokuje kolejne zapytania + może powodować timeouty Rezultaty zapytań są potrzebne do pokazania kolejnego ekranu gry.
  6. Przykład złego zastosowania. Server gry chce zgłosić koniec rozgrywki do pewnej usługi. Przetwarzamy żądanie, a potem chcemy spowodować: 1) aktualizację profilu użytkownika pod kątem zmiany doświadczenia, levelu itd. 2) Zdecydować o ewentualnych przynależnych nagrodach i dostarczyć je Jakie mogą być problemy? Jeśli dowolna z usług 2 i 3 nie działa to nie możemy poprawnie zakończyć gry Możliwe, że niesprawność usługi 2 powoduje złe decyzje ze strony usługi 3 Request jest długi, bo zawiera dużo logiki, co zajmuje procesy PHP i tym samym blokuje kolejne zapytania + może powodować timeouty Rezultaty zapytań są potrzebne do pokazania kolejnego ekranu gry.
  7. Ogólny model komunikacji asynchronicznej
  8. Ogólny model komunikacji asynchronicznej
  9. Ogólny model komunikacji asynchronicznej
  10. Promisy itd..
  11. Promisy itd..
  12. Ogólny model komunikacji asynchronicznej
  13. Głównie Symfony + PHP7 (nie HHVM), Korzystaliśmy z HHVM i było szybko ale: warmup aplikacji był dużym problemem – był w trakcie deploy, ale nie rozgrzewał wszystkiego, dużo timeout’ów (powyżej 5sek) Problem ze wsparciem dla dodatkowych kompilowanych bibliotek
  14. Głównie Symfony + PHP7 (nie HHVM), Korzystaliśmy z HHVM i było szybko ale: warmup aplikacji był dużym problemem – był w trakcie deploy, ale nie rozgrzewał wszystkiego, dużo timeout’ów (powyżej 5sek) Problem ze wsparciem dla dodatkowych kompilowanych bibliotek
  15. Trwałość – zapis na dysku, na zreplikowane na node’ach klastra Potwierdzanie Skalowalność – wiele node’ów w klastrze Wystarczająca wydajność – wyniki testów async? (Kafka być może szybsza, ale mniej niezawodna)
  16. With use_socket set to false producing messages (to rabbit that does not respond) will cause destructor to hang infinitely. With use_socket set to true consumers will not be blocking (they will crash after 1s of being idle) producers will work and use timeout, but they will simply ignore all errors (there's no way to tell that the message wasn't delivered) This bundle doesn't use confirm channels nor transactions, so basically rabbit does not guarantee that the message was delivered anyway. php-amqplib is poorly written and poorly maintained. It's incoherent, there's no way to tell which behavior was intended, and it often introduces regressions. I think original authors did not understand how sockets work. We could probably fix those two problems (timeouts and lack of confirmation), but I still think it's unwise to use php-amqplib, plus I wouldn't bother with pull request since it's better to not trust their commits. PHP extension ( http://php.net/manual/pl/book.amqp.php ) has outdated documentation and isn't available for hhvm. TBH I think we should look into "Pattern: reliable queue" here: http://redis.io/commands/rpoplpush, or write our own amqp lib and fork rabbitmq bundle.
  17. Możiiwy także crash w trakcie przetwarzania Co w sytuacji gdy nie działa Redis? (jest tylko dodatkową warstwą zabezpieczenia przed błędem RabbitMq, więc jak nie działa to ok)
  18. Motywacja dla takiego a nie innego flow Limit ponowień Dynamiczny delay -> 5, 100, 600, 3600 sek. Deadletter bez consumera Deadletter dla malformed messages Delay – natywny mechanizm RabbitMq poprzez TTL
  19. Odseparowanie usług Zachowana logika zarządzania – klient pyta o login, hasło i nazwę exchange i potem sam sobie ogarnia Czemu nie Shovel? Bo jego funkcje zawierają się Federation, Shovel nie ma API
  20. Ogólny model komunikacji asynchronicznej
  21. Ogólny model komunikacji asynchronicznej
  22. Ogólny model komunikacji asynchronicznej
  23. Ogólny model komunikacji asynchronicznej
  24. Ogólny model komunikacji asynchronicznej
  25. Ogólny model komunikacji asynchronicznej
  26. Ogólny model komunikacji asynchronicznej
  27. Ogólny model komunikacji asynchronicznej
  28. Ogólny model komunikacji asynchronicznej
  29. Ogólny model komunikacji asynchronicznej
  30. Ogólny model komunikacji asynchronicznej
  31. Ogólny model komunikacji asynchronicznej
  32. Klient tworząc access token wysyła swoje session id i ono pozostaje aktywnym session id. Jeśli ktoś odbierze powiadomienie o session ID niezgodnym to developer (gra) decyduje co zrobić – w tym przypadku wylogować.
  33. Ogólny model komunikacji asynchronicznej
  34. Ogólny model komunikacji asynchronicznej
  35. Dlaczego nie, dlaczego nadal coś może pójść nie tak
  36. Ogólny model komunikacji asynchronicznej
  37. Ogólny model komunikacji asynchronicznej
  38. Ogólny model komunikacji asynchronicznej
  39. Ogólny model komunikacji asynchronicznej
  40. Ogólny model komunikacji asynchronicznej
  41. Mają szansę na recovery z chwilowych awarii Poprzez dodawanie consumerów, niezależne skalowanie rabbitów itd.. Po zastosowaniu federation – z punktu widzenia usługi wszystko dzieje się lokalnie