kwietnia 06

Artykuł ten będzie małym przeglądem tego co można zrobić by oszczędzać moc obliczeniową twojego serwera i transfer twojego łącza. Jeżeli należysz do ludzi którzy uważają że najlepszym rozwiązaniem jest zawsze dokupienie szybszego łącza i większego kabla nie trać czasu na czytanie :)

I. Ajax

Dla nikogo odkrywcze nie będzie pewnie wykorzystanie technologii ajax. Po co przeładowywać całą zawartość strony jeżeli możemy podmienić tylko jej część. Jednak nawet to należy robić z głową. W sieci można znaleźć wiele przypadków mało optymalnego wykorzystania ajax’a.

1. Request po requescie

Często na portalach zdarza się że wykonanie jednego requesta generuje następny. Przykładem może być tutaj wykop.pl . Po głosowaniu przez użytkownika następuje update okna “Ostatio popularne”. Nie wiem dlaczego przy głosowaniu serwer nie mógł od razu zwrócić nowej wartości okna głosowania i okna “Ostatnio popularne”. Po pierwsze zamiast dwóch requestów był by jeden. Po drugie trwało by to krócej ponieważ w obecnej chwili użytkownik czeka na odbiór pierwszego zapytania i dopiero wtedy wykonywane jest drugie. Każde zapytanie trwa oddzielnie około 200-500ms podczas gdy razem trwały by około 250-550ms.

Aby ominąć konieczność wykonywania dwóch połączeń wystarczy po stronie serwera zebrać wszystkie dane. Umieścić je w odpowiedzi używając choćby protokołu json (w php mamy funkcje json_encode) zapisując zawartość każdego diva który chcemy podmienić. Przetworzyć całość po stronie przeglądarki używając małej funkcji do podmiany zawartości div’ów i javascriptowej funkcji evalJSON.

2. Wymiana zbyt dużej ilości danych

Kolejnym błędem jest często wymiana zbyt dużej ilości danych. Przykładowo przy głosowaniu na listę zamiast wymieniać zawartości całego div’a listy można jedynie podmienić div pozycji na która głosujemy i przeliczyć kolejność listy od nowa. Pojawia się tutaj problem jak przechować dane do obliczenia kolejności. Ja posłużyłem się prostym trikiem wykorzystując nieużywane zmienne css w których można zapisać np ilość głosów.

<span id=”rating_134 style=”orphans: 9;>9 punktów</span>

Wybrałem zmienna orphans do której zapisuje liczbę oddanych głosów. Później odpalam w javascripcie funkcje sortująca by posortować liste po danych pobranych ze zmiennej orphans. Ktoś się pewnie spyta po co tyle zachodu? Dla mnie to proste, zamiast podmienić całego div’a z listą zawierająca sto pozycji i kilkadziesiąt kilo danych, wymieniłem z serwerem jedynie informacje o części div’a jednej pozycji na liście przesyłając 1kb. Serwer nie musiał wykonywać kolejnego zapytania do bazy danych by przedstawić mi obecną postać listy ponieważ na podstawie danej ze stylu orphans byłem w stanie uzyskać ten sam wynik stosując jedynie wyliczenia po stronie przeglądarki. Przy robieniu serwisu który odwiedza 10 000 osób dziennie taka zabawa nie ma najmniejszego znaczenia, ale jeżeli odwiedzają nas setki tysięcy użytkowników to jest to wymierna oszczędność na transferze i obciążeniu bazy danych.

II. wykresy

Kolejnym bardzo obciążającym dla serwera zadaniem jest generowanie wykresów online. Tutaj najlepszym rozwiązaniem jest przeniesienie tego zadania do przeglądarki. Zamiast wykorzystywać biblioteki typu JpGraph po stronie php można użyć biblioteki HTML-Graphs . Plusem tego rozwiązania jest przeniesienie skomplikowanych obliczeń poza server. Minusem jest jednak konieczności wysłania do klienta dodatkowej biblioteki javascriptu. Biblioteka HTML-Graphs ma 28Kb, dodatkowo można ją skompaktować lub skompresować by zajmowała mniej miejsca. Jest jednak jeszcze jeden problem. Javascriptowe biblioteki które udało mi się znaleźć posiadały w sobie mniejszy wybór wykresów o słabszej jakości od jpgraph, lecz mimo to wybór bibliotek i wykresów jest spory. Wystarczy trochę pogooglać.

One Response to “ajax/javascript – wykorzystaj moc obliczeniową użytkownika”

  1. Bartosz Says:

    W pełni się zgadzam. Dodam że wiele rzeczy można przenieść na JS. Robiąc internetową grę, napisałem w PHP algorym A*, wyszukiwanie najkrótszej drogi. Po namyśle stwierdziłem że nie potrzebnie jest przesyłać ją AJAX’e, skoro użytkownik może obliczyć to sam. Serwer odetchnie, a użytkownik nawet nie zauważy.

    Pozdrawiam BartG

Leave a Reply

Preview: