czerwca 07
Podczas rozwoju dużego portalu webowego każdy prędzej czy później stanie przed problemem wydajności. Przeważnie najbardziej wąskim gardłem jest baza danych. Łatwo jest rozproszy obrazki na więcej serwerów, nawet content html czy pliki php. Najgorzej jest ze skalowalnością bazy. Nie dość że jest to problem od strony technicznej to również jest to najbardziej kosztowne. Po pewnej ilości użytkowników okazuje się że cachowanie, czy generowanie statyczne wszystkiego co było możliwe nie jest już wystarczające a na dodatek wielu użytkowników wykorzystuje opcję przeglądu czy search które pochłaniają najwięcej zasobów bazy danych. W takich przypadkach z pomocą może przyjść nam sphinx. Oczywiście jak w każdym przypadku jego zastosowanie niesie ze sobą wiele plusów i minusów a zadaniem tego artykułu będzie pokazanie jak sobie z tym wszystkim poradzić i jak optymalnie wykorzystać możliwości sphinx’a.
Sphinx to darmowy silnik SQL full-text search na licencji GPL 2. Jest to program pozwalający na zaindeksowanie wybranej przez nas części bazy danych i przeszukiwanie go w bardzo wydajny sposób . W chwili obecnej pozwala na podłączenie sie do MySQL’a i PostgreSQL’a. Posiada natywny support do PHP, Pythona, Javy, Perl’a i Ruby.
Continue reading »
kwietnia 07
Natchnieniem do napisania tego artykułu były dla mnie doświadczenie ostatnich kilku lat mojej pracy i to że mówienie NIE przynosiło mi często więcej pożytku od mówienia tak. Ostatnio znalazłem też w sieci artykuł 10 Absolute “Nos!” for Freelancers który pokazuje że nie tylko ja miałem podobne problemy, a kluczem do ich rozwiązania jest asertywność.
Czy możesz przedstawić nam projekt/atrape a my się zastanowimy
NIE!
Każda szanująca się firma przed podpisaniem umowy z klientem ustala ile kosztować będzie każda część pracy. Przygotowanie projektu, atrapy czy analiza też są płatne. Jeżeli masz poświęcać swój czas to nigdy za darmo. Przeważnie podczas tworzenia aplikacji faza analizy i projektu to koszt na poziomie 15-20% płatny od razu po wykonaniu. Klient zawsze może zabrać owoce pracy analitycznej i pójść do innego developera. W takich przypadkach zaproponuj że projekt/analiza może być wykonany za odpowiednią opłatą razem z przeniesieniem praw autorskich do projektu na klienta. Zaproponuj też podpisanie odpowiedniej umowy bo w przeciwnym razie napracujesz się za darmo a w najlepszym przypadku postawisz się na z góry przegranej pozycji podczas negocjacji ceny całego projektu ponieważ ty już włożysz swoja pracę za która będziesz chciał odzyskać pieniądze a zleceniodawca wykorzysta twoją naiwność i słabe położenie w negocjacjach.
Continue reading »
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ć.