2010. január 23., szombat

Cachelés

Szabvány szerinti portlet cache

A portlet szabvány szerint alapvetően kétféleképpen lehet portletet cachelni. Egyrészt expiration time alapján, másrészt ETag alapon. Mindkettő nagyjából megegyezik a HTTP-ben is alkalmazott módokkal. Egy kicsit az előbbire azért kitérek, mert a kiejtése speciális módon is történhet.

Az alapgondolat az, hogy a portlet egy önálló webalkalmazás, mely kezeli a saját megjelenítését, valamint a hozzá tartozó felhasználói akciókat. Ennek alapján cacheljük el a portletet, és majd csak akkor ejtsük ki, ha történt valami akció (vagy ha lejárt az expiration timer, persze). Probléma abból lehet, hogy ha más portlet is meg tudja változtatni az állapotát egynek, akkor a másik felé történt akcióra is ki kell ejteni. Erre az esemény-alapú IPC nyújt megoldást, mellyel lazán kapcsolhatjuk az összetartozó portleteket.

Fontos még a cachelendő portlet hatálya. Ez lehet publikus vagy privát. Előbbi esetben minden felhasználónak ugyanúgy jelenik meg, így csak egyetlen példányt elég tárolni, utóbbiban azonban minden sessionhöz kell egyet-egyet.

Ez az egyszerű megoldás sok esetben akár elégséges is lehet, így kevés fejfájással sokat tudunk dobni a portál teljesítményén, és ha figyelünk az eseményekre, akkor a cachehibákat is elég jól el tudjuk kerülni. A Liferay egyik sajátossága, hogy jelenleg a vendég felhasználóknak nem gyorsítótáraz. Nem tudom, hogy ez miért jó, de jelenleg így van.

Liferay cachelési megoldása

A Liferay lehetőséget ad a portál cache használatára, melyet magától karbantart, és a Vezérlőpultból lehet is törölgetni, valamint elvileg a fürtözést is támogatja. A használata egyszerű, mint a faék. Vannak cachek, melyekbe betehetünk és kivehetünk objektumokat, kulcs alapján. Az eléréséhez a MultiVMPoolUtil-t tudjuk használni, ennek a getCache(név) metódusával tudunk cache-t elkérni, és a get/put-al az értékeket kezelni. Használhatjuk a SingleVMPoolUtil-t is ugyanígy, a kettő között elvileg a fürtözés a különbség, de ezt még nem próbáltam ki. Az egyes cacheknek a tulajdonságait az ehcache beállító xml-jeiben tudjuk kezelni, itt megadhatunk maximális méretet is a táraknak.

Ez egy elég egyszerű megoldás, amire végülis bármilyen bonyolult egyedi gyorsítótárazást rá tudunk építeni. Mielőtt azonban nekiállnánk valami nagyon általánosnak, érdemes figyelembe venni, hogy JPA szinten az adatbázis entitások már cachelve vannak, ezért egyszerű portleteknél nem biztos, hogy szükség van további gyorsítótárazásra. Először érdemes kimérni, hogy valóban bottleneck-e az adott portlet megjelenítése, és csak utána optimalizálni. Ahogy a mondás tartja: Premature optimalization is the root of all evil.

1 megjegyzés: