Temat: Szybkość aplikacji
Paweł Chalacis:
Wojciech Zieliński:
Z reguły baza MySQL jest najszybsza - jednak to zależy od tego, jakie zapytania będziemy robić. Jeśli mają to być proste zapytania, bez wielopoziomowych złączeń, jakichś procedur wbudowanych i na dużych (naprawdę dużych :)) zestawach danych itp. - MySQL chyba wygrywa.
to nie jest rok 2000. MySQL jest w chwili obecnej najgorszym chyba darmowym silnikiem bazy danych. Postresql wygrywa chyba pod każdym względem, przede wszystkim w serwisach z większym ruchem. Co do języka - php do wydajnych nie należy, do tego dochodzi jeszcze narzut frameworka, kompilacja szablonów (czy to smarty, czy xslt, zawsze "coś" narzuci).
Mimo tego - duet php + postgresql nadaje się do praktycznie wszystkich zastosowań.
Nie ma rzeczy nadających się do wszystkiego - jeśli coś jest do wszystkiego, to jest do niczego :)
Co do duetu, o którym wspomniałeś (jak i kilka innych osób) - Postgres jest owszem wspaniałą bazą. Używamy go nagminnie głównie w naszych aplikacjach. Dostarcza bardzo bogatej funkcjonalności - o niebo bogatszej od MySQLa. Jest dużo uniwersalniejszy i ma efektywniejszy mechanizm przygotowywania planu zapytania.
JEDNAK przez to, że jego funkcjonalność jest bogatsza i ma dalece nieporównywalnie wyższe możliwości w zakresie tworzenia złożonych zapytać - JEST WOLNIEJSZY PRZY PROSTYCH ZAPYTANIACH od baz, które na te prostsze zapytania postawiły główny środek ciężkości. Zmierzam do tego, że jeśli mamy zapytanie: SELECT sth FROM table WHERE sth = 'sth else', a table ma 20 mln rekordów - MySQL będzie szybszy niż Postgres. Wystarczy jednak, że dołożymy JOINa - Postgres zacznie wygrywać.
Paweł Chalacis:
Jeśli jednak chodzi o strony [...]
a ten spam o tym, że macie cache w swoim systemie obsługującym AŻ dwa serwery to mogłeś sobie jednak darować...
Coś mi się widzi, że nie zrozumiałeś... Ale inni tak, więc jeśli potrzebujesz dodatkowego wsparcia - zapraszam na prv :)
Dzięki temu możemy sobie pozwolić na np. nie wykorzystywanie kluczy obcych
(które z definicji spowalniają działanie).
a o integralność danych dbają skompilowane dane. Jezu jaki bełkot.
No tak - zdecydowanie nie zrozumiałeś...
Dane na serwerze prezentacyjnym służą TYLKO odczytowi - nie są NIGDY modyfikowane - jedynie ładowane na zasadzie bulk-loadu. Dane na serwerze administracyjnym, którego obciążenie jest nieporównywalnie mniejsze są w pełni relacyjne i nota bene stoją na Postgresie.
Peter Kowalski:
No też mnie to zastanawia. Wojtku Z. Czy mógłbyś ten temat
rozwinąć? Rozumiem, że system pracuje szybciej, ponieważ serwer
który stoi na pierwszej linii frontu user->serwis serwuje
statyczne pliki. Tylko, czy jest to:
1) wygodne
2) drogie - dwa serwery, to nie jeden
3) po co cms w takim razie - frontpage robi to samo
Ogólnie - serwer prezentacyjny tylko w określonych sytuacjach serwuje statyczne pliki. Częściej "składa" stronę ze statycznych plików (więc trochę "logiki" ma). Przykładowo - składa stronę z pliki "naglowek.html", "tresc.html" i "stopka.html". Inny przykład - wyniki wyszukiwania - w bazie MySQL system znajduje wszystkie wiersze spelniajace kryteria (np. dla
www.twoje-zdanie.pl wszystkie firmy z okreslonego wojewodztwa). Następnie dostaje listę IDkow, ktore jednoczesnie sa nazwami plikow, w ktorych mamy skompilowane "itemy" listy - i sklada z niej liste.
Statyczne pliki są tworzone w przypadku stron, na ktorych tresc w zaden sposob nie wplywa ogladajacy - przykladem takiej strony jest
strona typu wizytówkowego.
Tak naprawdę to, co determinuje które elementy i strony w jaki sposób są kompilowane (w całości, częściowo, przy publikacji, ad-hoc automatycznie, w momencie wystąpienia jakiegoś zdarzenia, o określonej porze itp.) determinowane jest przez tzw.
komponenty, z których zbudowana jest strona. Ale to historia na inny chyba wątek :)
Ad. 1. conajmniej tak samo wygodne jak std CMS - bo cala zabawa w kompilacje, potencjalne kompilacje automatyczne itp. sa wykonywane całkowicie przezroczyscie. Jedyną może różnicą (choć niektóre CMSy dostarczają takiej funkcjonalności - u nas jest to niejako "wymuszone") jest fakt, że po wprowadzeniu zmian na stronie (w interfejsie CMSa) trzeba je "opublikować" - czyli kliknąć "Publikuj" aby system wysłał zmiany na serwer prezentacyjny (oczywiście jest też wcześniejszy "podgląd" na serwerze administracyjnym).
Ad. 2. serwery moga być logiczne - mamy instalacje systemów na jednym serwerze, jedynie z rozbiciem logicznym. Przy takiej architekturze sprzętowej więc nie jest to droższe. Jeśli jednak chcemy zastosować architekturę "z prawdziwego zdarzenia" (którą sugerowałbym w przypadku większych stron) - wtedy rzeczywiście 2 serwery sprzętowe są droższe niż jeden :)
Ad. 3. odpowiedź jest taka sama, jak dlaczego stosujemy CMSy a nie robimy strony we Frontpage. Od strony użytkownika to działa i wygląda jak CMS. Od strony technicznej to wygląda inaczej :)
Paweł Włodarski:
Tak z ciekawości. Co dokładnie was skłoniło do
zaprojektowania właśnie takiej architektury?
Głównym elementem było zastanowienie się, jak większość CMSów działa. Otóż mamy sobie bazę danych do której z jednej strony mamy podpięty interfejs administracyjny, a z drugiej stronkę. Jak chcemy coś zmienić na stronie, przez interfejs administracyjny zmieniamy coś w bazie. Jeśli chcemy odświetlić stronę, strona za każdym razem "pinga" się do bazy, aby wiedzieć co pokazać.
I teraz kluczowe pytanie - jak często zmieniamy stronę, a jak często jest ona prezentowana ? Wydaje mi się, że częściej jest ona prezentowana... Co oznacza, że wielokrotnie "pingamy" się do tej bazy bez sensu - bo dane, które dostaniemy i tak są takie same.
Oczywiście - można by stwierdzić, że taką rolę pełni jakiś uniwersalny cache. Ale cache jest z reguły czasowy - a nasza architektura jest bardziej funkcyjna - czyli zmienia zawartość "cache" (serwera prezentacyjnego) TYLKO kiedy jest rzeczywiście taka konieczność.
Jest oczywiści jeszcze kilka innych elementów, które według nas powodują, że architektura jest lepsza:
- bezpieczeństwo - kompletna separacja danych od ich widoku - serwer prezentacyjny nie ma bezpośredniego (a czasem i pośredniego) dostępu do serwera administracyjnego, więc włam na warstwę prezentacyjną nie niszczy tak naprawdę danych (czasem również chroni dane wrażliwe - jak np. w
jednym z naszych wdrożeń systemu Akademickiego Biura Karier dane na temat CV studentów)
- łatwość odtworzenia - załóżmy, że ktoś się włamał na nasz serwer prezentacyjny (stronkę) i zniszczył wszystkie podstrony, jak i bazę, o której w jakiś sposób się dostał. Odtworzenie polega praktycznie na kliknięciu "Publikuj" na serwerze administracyjnym i wszystko jest od nowa kompilowane i wrzucane na prezentacyjny. Innymi słowy - dumny włamywacz jedynie zaatakował i zniszczył kopię :)
Jest jeszcze jeden powód wykorzystania tego rodzaju architektury. Mianowicie nasz
COBAEX CMS działa na naszej platformie
COBAEX. Platforma ta pozwala na instalowanie różnorodnych aplikacji - w tym systemów raportujących (
COBAEX RPT) czy dedykowanych systemów
CRM/ERP. Takie systemy nie powinny raczej działać gdzieś na jakimś serwerze w internecie, a wewnątrz sieci firmowej. Jednocześnie w obecnych czasach odchodzi się od samodzielnego utrzymywania strony w ramach swoich serwerów, a wyrzuca się ją na zewnętrz na serwery typu home.pl czy kei. Jednak wygodnie byłoby, aby zarządzać tą stroną z naszego systemu zintegrowanego - chociażby z uwagi na możliwośći użycia single-logon czy powiązania strony z naszymi systemami sprzedażowymi.
Zastosowanie opisanej architektury pozwala właśnie na odseparowanie warstwy administracyjnej od prezentacyjnej. I pozwala na de-facto uzyskanie pełnej inercji i integracji naszych innych rozwiązań z naszym systemem CMS przy jednoczesnym utrzymywaniu strony (serwera prezentacyjnego) na zewnętrz.
Uff - mam nadzieję, że rozwiałem wszelkie wątpliwości :) Jeśli jednak nie - zapraszam do dalszej dyskusji :)