Blog
Chat i AJAX
25.11.2007 - Niedziela - 21:43
Od kilku dni skrobię sobie (a właściwie nie sobie tylko dla lokalnego forum) chat. Ale nie taki zwykły chat, jaki każdy sobie od razu wyobraża. Chat oparty o AJAX...
A trzeba przyznać, że to nie jest prosta sprawa. Typowy chat z działającym serwerem w postaci oddzielnej aplikacji oraz klientami w postaci apletu Javy jest chyba najoptymalniejszym działaniem. Ale kiedy nie ma możliwości postawienia takowego serwera, a i znajomość Javy kuleje, trzeba posiłkować się półśrodkiem ;-)
Półśrodek ten zwie się technologią AJAX czyli połączeniem asynchronicznego Javascriptu i XML-a. I pozwala na bardzo wiele. Można z jego pomocą wykonać chat, ale należy rozwiązać kilka palących i nie dających mi spać po nocach oraz na wykładach problemów ;-)
Po pierwsze odświeżanie. Połączenie klient-serwer jest oczywiście inicjowane przez klienta, ale protokół, na którym pracujemy - HTTP - w wersji 1.1, co prawda pozwala na podtrzymywanie połączenia, ale nam to niestety nie robi różnicy. HTTP niestety ogranicza się do komunikacji zapytanie klienta - odpowiedź serwera. Nie da się wygenerować dwóch odpowiedzi do jednego zapytania. A każde zapytanie i każda odpowiedź to dodatkowe bajty, z których mamy niewielki pożytek. I te dane efektywnie (oraz efektownie) zapychają łącze nasze i serwera. Jeden z klientów wysyła swoją wypowiedź do serwera, a serwer musi ją zmagazynować. Nie może ich wysłać do klientów, jeśli oni o to nie poproszą. Ale oni nie wiedzą, że coś nowego dla nich jest, więc muszą odpytywać serwer co jakiś czas. I generują ruch... A odpytywać muszą często, tym częściej im więcej osób pisze, tak by nie było widać opóźnień (w ircowym slangu zwanych lagami). Na szczęście chat, który piszę nie będzie miał nadmiernej ilości użytkowników, a swoje rekordy w ilości gości będzie bił tylko w momencie gdy będzie moderowany, a więc będzie można rozsądnie obniżyć częstość odświeżania, tak aby nie generować niepotrzebnego, "pustego" ruchu.
Drugi problem wynikający z zastosowania AJAX-a to problem z obciążeniem bazy danych. Za każdym razem gdy gość odpytuje serwer, skrypt musi połączyć się z serwerem bazy danych, zweryfikować dane autentykacyjne i dopiero zrealizować żądanie klienta. Jak można by to przyspieszyć? Przez cache'owanie? Ale jak?
Lista gości obecnych na chacie? Jak? Ja nie mogę stwierdzić, czy klient już się rozłączył, czy za chwilę ponownie się połączy, żeby pobrać nowe wiadomości. Jedynym sensownym wyjściem jest odliczanie czasu od ostatniego kontaktu. Ale to jest kolejne mało efektywne rozwiązanie.
O takiej rzeczy jak rozmowy prywatne nawet nie chcę wspominać, bo jak tylko to mi przychodzi na myśl, to włosy stają mi dęba i zaczynam odczuwać lęki ;-)
Za to nie przewiduję większych kłopotów z wprowadzeniem moderacji. Mój dotychczasowy pomysł prawdopodobnie będzie bardzo dobry i sprawdzi się w działaniu. No i moderacja w pewnym stopniu odciąży serwer od ciągłego przepytywania bazy danych.
Na razie jeszcze nie natrafiłem na problem, którego nie mógłbym rozwiązać w mniej lub bardziej elegancki sposób. Ale, prawdę mówiąc, to ledwo zacząłem, więc jeszcze wszystkie prawdopodobne kłopoty mogą mi się przytrafić i pewnie mi się przytrafią ;-) Ale życzcie mi szczęścia. Zobaczymy czy uda mi się zrobić zastępnik javowego chata przy pomocy Javascriptu i XML-a ;-)
Ajax
02.05.2007 - Środa - 22:16
Od naprawdę dawna mobilizowałem się do tego, żeby wziąć się za AJAX-a. Ciężko było. Kilka razy rozpoczynałem, ale natychmiastowo traciłem chęci. Dzisiaj wreszcie przekroczyłem ten próg, a to wszystko za sprawą XAJAX-a, który, wedle autorów, jest najprostszym sposobem na AJAX-a w PHP ;-)
I faktycznie. Bardzo przyjemnie się z tym pracuje. Wcale nie trzeba znać głęboko JavaScripta (a ja go niespecjalnie znam), a wykorzystanie AJAX-a jest bardzo proste, bo ogranicza się do określenia działania i jego oprogramowania. Naprawdę bardzo przyjemna rzecz.
A teraz staram się wgłębić nieco bardziej w tę bibliotekę czytając zawartość jej dokumentacji. Może za kilka tygodni będę w stanie stwierdzić, że umiem korzystać z AJAX-a ;-)
Pozostaje do nauczenia się jeszcze Python ;-)
A nie wiecie może o co chodzi z gmsk.net? ;-)
