Dwa słowa o wydajności Vaadin
Jak rozmawiam z kimś o Vaadin to pada zazwyczaj pytanie „co z wydajnością”. Otóż odpowiedź na to pytanie jest dość dobrze znana i brzmi „to zależy”.
Vaadin działa w trochę inny sposób niż typowe, nawet ajaxowe, aplikacje webowe. Ma to związek z jego architekturą i utrzymywaniem aktualnego stanu okna również po stronie serwera. Zatem każda interakcja z użytkownikiem musi przejść przez serwer. Pomimo to całość operacji jest realizowana stosunkowo szybko. Wynika to ze sposobu komunikacji. Do serwera wysyłane jest żądanie w postaci stringa, w którym znajduje się tylko informacja na temat zmian w komponentach plus hash sesji plus jakieś duperele dotyczące zmian w UI. Odpowiedź serwera to znowuż JSON obudowany w prosty javascript, który go wywołuje. Całość jest obrabiana w CSE (Client Site Engine). Tu jednak kryją się dwie pułapki. Pierwsza z nich to przesłanie za dużej ilości danych. Bądź co bądź, ale np. 500kb tekstu to dość dużo i ściągnięcie takiej ilości po prostu trwa. Druga z nich to konieczność aktualizowania dużej ilości komponentów w ramach jednej operacji. Wyobraźmy sobie np. ściągnięcie tabeli zawierającej około 1000 rekordów i mającej 12-15 kolumn. Obrobienie takiego wsadu danych po stronie JS trwa. Zresztą 500kb skryptu, które musi być w całości wykonane zawsze będzie trwać i to nie zależnie od tego z jakiej przeglądarki korzystamy. Ratunkiem w tym konkretnym przypadku jest „cwaniactwo” tabel w Vaadin, które to tabele potrafią dociągać zawartość w miarę potrzeb. Gorzej jeżeli będziemy musieli wyświetlić wszystko na raz (po co to ja nie wiem, ale są tacy dziwni ludzie). W tym momencie czeka nas przerwa na kawę.
Co jeżeli porównamy sobie to z innymi frameworkami? Jeżeli ktoś potrafi mi wskazać framework, który potrafi w sposób niezauważalny dla użytkownika ściągnąć pół mega danych i wstawić je na stronę jako tabelkę to proszę bardzo. Jednak powiem od razu będzie trudno. Oczywiście Vaadin nie jest jakiś super wydajny. Można by to było zrobić znacznie lepiej dając użytkownikowi na przykład możliwość renderowania zawartości statycznej po stronie serwera i odsyłane czystego HTML, ale coś za coś.
Ostatnią rzeczą na jaką należy zwrócić uwagę jest korzystanie z zasobów. Tu problemem może okazać się „zapominanie” o tym, że na przykład dynamiczne tworzenie obrazków po stronie serwera jest zasobochłonne (i to jak diabli) oraz, że odesłanie np. 1MB obrazka też zabiera łącze i czas. Można się tu dość nieprzyjemnie naciąć na problemy w stylu „w testach działało, a jak mam 10 userów to padło”. Dobrą praktyką, którą polecam też przy innych nie Vaadinowych aplikacjach, jest przepuszczenie szturmu na serwer o parametrach produkcyjnych za pomocą JMeter posadzonego na kilku maszynach i działającego w trybie LOICW. Warto wcześniej uprzedzić adminów… hehehe
To tyle za niedługo czeka mnie bój Vaadin + Liferay, czyli próba uruchomienia Vaadin jako elementu portalowego. Może być ciekawie.