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.

4 myśli na temat “Dwa słowa o wydajności Vaadin

  1. Liferay + portlety w Vaadin – potwierdzam, działa. Jednak ze względu na (i tu nawiązanie do artykułu właściwego) wydajność, postanowiliśmy w końcu użyć Wicketa. W Vaadin zanurzonym w liferayowych portletach każda akcja zdawała się skutkować kilkuset milisekundowym opóźnieniem, co wbrew pozorom ma znaczenie. Nie przesądzam, czy przyczyną był Vaadin czy otoczka Liferaya.

  2. Witam
    Fajny artykuł, myślałem że tylko ja w polsce programuje w Vaadin 😉 jestem ciekawy jak poszło tobie z tym Vaadin + Liferay ponieważ mam plan do tego samego usiąść może masz jakieś przykładowe kody lub ciekawy artykuł. Z Liferay dopiero co się zaprzyjaźniam , fajnejnie by było to z vaadin sprzęgnąć.

    Pozdrawiam
    Tomasz Bylica

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax