Prośba o radę: WebSocket / Ajax

2016-06-08 01:58:34 Post #1 thorash

 
Robię sobie grę.. i chciałbym zasięgnąć jakiejś rady, od uzbrojonych w doświadczenie.

Gra polega na tym, że potrzebna jest mi mocna interakcja między 2 użytkownikami w jednym czasie - ale nie koniecznie czasie rzeczywistym. Od 1 do 4 sekund opóźnienia jest dla mnie w pełni wystarczające.

Piszę w jquery + php + mysql i staram się to łączyć ajaxem póki co wychodzi super i jest fajnie... ale zaczynają mnie nurtować odległe pytania i potencjalne problemy z którymi nigdy nie miałem styczności.

Zamysł w olbrzymim okrojonym skrócie: każdy chodzi sobie po mapce, a mój skrypt ajaxa co sekunde(1-4sec) sprawdza czy ktoś na mnie nie wdepnął. Jak wdepnął. To turowo trwa walka między tymi userami, ajax wtedy sprawdza czy przeciwnik coś mi zrobił, jeśli coś kliknął to sprawdza jaki jest tego skutek i wyświetla odpowiednią animacje.

Wszystko jest fajnie działa i gites ale... czytając, rozmawiając i gdybając nasuwają się pytania.

1. Grę testowało 10 osób online na raz i nie było żadnych problemów. Co może mi się przytrafić gdy zacznie grać 1000 online? Gdzieś usłyszałem że takie przykładowo 1k zapytań na sekundę może zostać potraktowane jako DDoS i mogę mieć problem... czy na serio powinienem się tego obawiać ? Czy jest to później jedynie problem, że wraz ze wzrostem aktywności użytkowników będę musiał podnieść transfer i wydajność hostingu, po prostu wiąże się to tylko z wykupieniem odpowiednio mocniejszej usługi ?

2. Optymalizacja, aktualnie działa to u mnie w taki sposób, że ajax daje zapytanie co 2sec i sprawdza czy zmienna "stan" ma taką samą wartość jak w mysqlu. Jeżeli wartość jest taka sama to sprawdza sobie dalej za kilka sekund. Jeżeli inny user zrobił coś co ma bezpośredni wpływ na mnie to zmienia moją wartość "stan", jeżeli przy sprawdzeniu są różne, to ajax odpala php z długim zapytaniem co się stało, jakie konsekwencje i animacje mam zobaczyć. Zaczęło mnie nurtować jedno - ajax co sekunde wywołuje zapytanie do sql'a, słyszałem, że często ogólne ustawienia są takie, że w jednym czasie do bazy może istnieć 24 połączenia (nie wiem czy to mit!?).

Zacząłem się nad tym zastanawiać i przyszedł mi pomysł, czy nie lepiej byłoby żeby trzymać zmienną STAN zamiast w bazie danych, to stworzyć zwykły badziewny plik txt dla każdego użytkownika. Jeżeli inny użytkownik robi mi coś to nie zmienia STAN w bazie danych tylko wartość tego pliku txt. Niech on waży 1bajt. Teoretycznie zamiast co sekunde pytać sql czy się coś zmieniło - mógłby sprawdzać lekki jak wiatr plik txt... Co omija blokowane 24 połęczenia w jednym czasie i dodatkowo jest (wydaje mi się) o niebo lżejsze.

3. Websocket - może powinienem od tego zacząć :/ zazwyczaj jeśli z kimś rozmawiam to każdy rzuca "ić stond" poucz się websocketów to rozwiąże twoje problemy z realtime app... i na tym się kończy pomoc tutaj się zaczynają schody - nigdy nie korzystałem z frameworków ani nie miałem możliwości instalowania bibliotek... nie miałem możliwości korzystania z konsoli itd... z tym się wiążę server dedykowany który trzeba sobie wykupić a nie bardzo mnie na to stać. Pytanie czy websocket jest wspierany przez wszystkie przeglądarki zwłaszcza te mobilne bo póki co na telefonach gierka śmiga. Pytanie czy moje kombinowania mają jakiś sens, czy mam to ugasić i inwestować w websocket ?

Prosiłbym żeby mnie potraktować wyrozumiale

2016-06-08 12:22:02 Post #2 nospor

 
No websockety tutaj to jedyne sluszne rozwiązanie. Niestety sam jeszcze z nimi nie pracowałem to za bardzo ci nie pomogę. Jedyne co ci mogę powiedzieć, że nie potrzeba do tego żadnych FW php co chyba wynikało z twojego posta.
AJAX co sekunde niestety przy większym ruchu zabije serwer.

2016-06-11 22:51:58 Post #3 thorash

 
Stanęło na tym, że optymalizuje grę i robie póki co ajax co sekundę ale tylko i wyłącznie wtedy kiedy na serio trzeba a nie zawsze kiedy nadarzy się choćby hipotetyczna próba konfliktu użytkowników.

Nie zmienia to faktu, że ciągle temat nie daje mi spać choć jestem o wiele spokojniejszy... rozmawiałem z administratorem swojego hostingu i troszkę mnie uspokoił zwłaszcza jeśli chodzi o podejrzenia DDoS. Ostatecznie moge po prostu przeciążyć serwer... a gdy statystyki wraz z wzrostem użytkowników i ruchu aż tak zaczną skakać żeby mieć wpływ na przeciążenie serwera to powiedział że wtedy będą się odzywać z odpowiednio przygotowaną ofertą. Z drugiej strony instalacja środowiska PHPratchet na którym działają WebSockety kosztowałaby mnie 100zł/rok a tu już nie są żadne pieniądze w porównaniu do kosztów serwera dedykowanego.

Boję się jednak dwóch kwestii jeśli chodzi o websoket (tutaj nie jestem pewien czy nie bredzę) ale z czego co czytałem to websocket ciągle w niektórych przeglądarkach jest uznany za prototyp który niesie zagrożenie i nie jest wspierany albo jest duże prawdopodobieństwo że nagle przestanie. Druga sprawa to że websocket nie działa za fajnie na wersjach mobilnych a to strasznie by mnie ścinało. Póki co ajax działa wszędzie na wszystkim.

Po przemyśleniach sprawy podejmuje takie rozwiązanie, żeby ajax co sekundę sprawdzał ale nie pytając do sql czy coś się zmieniło - tylko zwykły plik tekstowy... treść tego pliku będzie zmieniał użytkownik który będzie przyczyną konfliktu... jeśli odświeżany plik odświeży się z inną wartością niż poprzednia - ajax wyślę konkretne zapytanie do sql. Nie wiem czy to pytanie pliku txt to rozsądne wyjście ale wydaje mi się o niebo lżejsze niż ciągłe pytanie sql'a.

Pytanie jakie sobie teraz stawiam... Czy na serio 1000 użytkoników pytających co sekundę plik text który waży coś około kilku bajtów, na serio jest w stanie przeciążyć serwer. Jestem też ciekaw jakie przeciążenie niesie za sobą websocket przy 1000 użytkowników online przy działającym aktywnym połączeniu...

Tak sobie gdybam, że gdyby to tak na serio było groźne to 1000 ludzi trzymających f5 przeglądarce byłoby wstanie blokować serwery... wtedy ludzie robili by głupie akcje na fb żeby takie coś osiągnąć ale może brednie gadam....

2016-06-13 15:54:30 Post #4 nospor

 
To umów się z 1000 ludzi i poblokujcie jakieś strony

ajax z definicji nie nadaje się na takie akcje. Owszem, odczytanie samego pliku niz latanie do bazy będzie lżejsze i może nawet ci to pociągnąć ale tak się robiło kiedyś, teraz mamy SOCKETy.

Z tymi przeglądarkami to jakieś brednie.

Zaś takie testy z 1000 osób to możesz sam łatwo zrobić przy pomocy jakiegoś programu do testowania wydajności, np: ab
https://httpd.apache.org/docs/2.4/programs/ab.html

2016-06-13 16:36:24 Post #5 thorash

 
Ooo to przydatna rzecz...

Póki co optymalizuje i liczę na to że na razie wystarczy. Rozdzielam strukturę w taki sposób by w razie czego tylko podmienić sposób pobierania danych.

Jeśli sokety zdziałają niezawodnie na wszystkich przeglądarkach w tym i zwłaszcza w tym mobilnych to jest to super informacja.

Odpowiedz

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer