1010
20.12.2010, 14:58:09
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
20.12.2010, 15:40:14
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
20.12.2010, 15:45:37
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 zdarzeniachCią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
20.12.2010, 16:02:15
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
Mephistofeles
20.12.2010, 16:02:27
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
20.12.2010, 16:15:51
Pobaw się Javą. Serwer
sam Ci prześle dane kiedy ktoś napisze odpowiedź.
Nie będziesz musiał pingować, żeby sprawdzić czy ktoś coś napisał
bim2
20.12.2010, 18:18:14
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

Polecam Ajax Push Engine