Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czat AJAX a obciążenie serwera
Forum PHP.pl > Inne > Hydepark
1010
Witam,
w jednym z moich serwisów zamierzam wprowadzić czat, czyli możliwość komunikowania się z osobami, które są obecnie zalogowane. Chciałbym oprzeć to na jQuery. O ile dobrze do tego podchodzę to powinienem zrobić jakąś tabelkę w bazie, zapytanie które wyciąga aktualne konwersacje itp. Całość co jakiś czas będzie automatycznie wywoływana przez jQuery (AJAX). Pytanie tylko, czy przy dość małym czasie odświeżania takie coś nie zajedzie serwera?

Teraz takie moje teoretyczne rozważania:
Biorąc pod uwagę, że na stronie siedzi 200 osób, dla każdej z nich powiedzmy co 2 sekundy zostanie wywołane automatyczne zapytanie, które będzie sprawdzało czy nie przyszły jakieś wiadomości. Czyli wychodzi średnio 100 zapytań na sekundę. Jest to stosunkowo dużo, porównując całość do sytuacji w której nie ma czata i osoba przeładowuje stronę raz na jakiś czas (powiedzmy średnio do 20-30 sekund).

Jak takie coś ma się do wydajności? Czy oparcie tego czatu ba bazie danych jest dobrym rozwiązaniem?

Myślałem też, żeby zrobić tak, że w przypadku gdy osoba nie prowadzi konwersacji (czyli przez jakiś czas nie przychodziły wiadomości), żeby czas odświeżania wydłużyć do np. 10 sekund, a skracać powiedzmy do 2s. tylko w przypadku, gdy jest obecna rozmowa.

Kolejna rzecz o którą chciałbym zapytać, to przy jakim czasie odświeżania rozmowa jest dość płynna? Czy np. 5 sekund jest już zbyt dużym czasem, żeby można było swobodnie porozmawiać?



Oczywiście nie oczekuję na odpowiedzi w stylu "zachciało Ci się czata to kup porządny serwer, który sobie z tym poradzi"
Chodzi mi raczej o same podejście, czyli jak to zrobić żeby było to najbardziej optymalne.

Z góry dziękuję za jakiekolwiek wskazówki i naprowadzenia.
marcio
Zalezy od tego jak bardzo aktywny bedzie ten czat na twojej stronie, jesli malo to 5sec jest ok jak juz duzo ludzi zacznie pisac to powyzej 2sec nawet nie idz wiem z doswiadczenia.....sam mialem kiedys shoutbox na stronie przy 3 osoback ktore intenswynie pisaly jak na gg wszystko ladnie chodzilo ale refresh byl chyba co 1sec...
vokiel
I tutaj przydałyby się sockety, niestety okazało się, że są nie dość bezpieczne i producenci przeglądarek się z nich wycofali.
Kiedyś szukałem czegoś podobnego, zobacz ten temat: Komunikacja (powiadamianie) ServerSide -> ClientSide oparte na zdarzeniach

Ciągłe odświeżanie przy większej liczbie użytkowników zabije serwer, chyba, że w miarę wzrostu obciążenia wydłużysz interwał odświeżania.
thek
A po co kombinować zanadto i odświeżać. Już kiedyś pisaliśmy w tematach o "inteligentnych czatach" z innymi moderatorami. Nie sens ściągać wszystko, bo to głupota. Sens to ściągać gdy jest to konieczne. Jak? W parametrze AJAX ustawiaj znacznik czasowy ostatniej wiadomości jaką ma klient. Wysyłaj to do serwera i porównuj ze znacznikiem czasowym ostatnim na serwerze. Jeśli to samo to znaczy, że nic nowego nikt nie napisał i można olać sprawę. Jeśli znacznik na serwerze jest wyższy to wiadomość jest i wyślij do skryptu ją lub grupę wiadomości w jakimś formacie (JSON) do obróbki przez skrypt już u klienta. I tutaj już będzie Cię lało czy odświeżasz co minutę, czy sekundę. Skrypt zrobi swoje tylko gdy będzie musiał. Lepiej zwrócić do skryptu 10000 razy false niż 10000 razy pobierane ciągle rzeczy, czy choćby nawet 10000 razy scache'owane. Nie zabijasz serwera. AJAX wywołuj co 5-10 sekund u klienta. Nie ma sensu częściej. Pisanie odpowiedzi przez ludzi trochę trwa smile.gif
Mephistofeles
Można wykorzystać Comet, jak na Facebooku, obciążenie powinno być mniejsze. Dzięki temu masz jedno, ale długie żądanie, w którym serwer odpowiada gdy zajdzie taka potrzeba. Co jakiś czas wystarczy tylko ponowić żądanie.
mike
Pobaw się Javą. Serwer sam Ci prześle dane kiedy ktoś napisze odpowiedź.
Nie będziesz musiał pingować, żeby sprawdzić czy ktoś coś napisał tongue.gif
bim2
Tak jak Mephistofeles powiedział, wykorzystaj Comet. Tworzysz iframe który w adresie ma podaną lokację do skryptu działającego w nieskończoność. Wtedy powiedzmy jak ktoś doda coś do bazy, to robisz echo 'wiadomosc'; flush(); i javascriptem poprawnie sobie to odczytujesz winksmiley.jpg

Polecam Ajax Push Engine smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.