OSCache

Z FI WIKI
Přejít na: navigace, hledání

URL: http://www.opensymphony.com/oscache

OSCache je řešení, které obsahuje knihovnu JSP tagů a soubor tříd. Tento nástroj umožňuje dynamické cachování obsahu JSP stránek, odpovědí servetů nebo libovolných objektů. Načtené informace může ukládat v operační paměti nebo na pevném disku a umožňuje tak toleranci chyb jako je například výpadek databázového serveru.

Základní charakteristiky

  • Obsah paměti je dostupný ve standardních rozsazích, se kterými je každý programátor JSP stránek obeznámen. Aplikační rozsah umožňuje jedno vyrovnávací paměť pro celou aplikaci a tedy pro všechny uživatele společnou. Rozsah v rámci session na druhé straně umožňuje využívat speciální paměť pro každého uživatele.
  • Obsah paměti může být zapsán na disk, což umožňuje zachování obsahu i přes restart aplikačního serveru. Zápis na disk může být i z důvodu překročení velikosti paměti.
  • Vyrovnávací paměť může být obsažena v operační paměti, na disku nebo se může vytvořit řešení, které kombinuje první dvě možnosti. V posledním případě je možné omezit velikost v operační paměti a při překročení tohoto omezení odložit některé data na disk, jehož paměť lze v určitém pohledu považovat za nekonečnou. Objekty jsou pak vyjmuty z operační paměti, ale pořád jsou dostupné na pevném disku. Pokud je objekt znovu požadován a jeho platnost nevypršela, je načten s disku. Tento přístup zvyšuje toleranci k chybám typu výpadek aplikačního serveru.
  • Ve správě vyrovnávací paměti je implementován algoritmus, který řídí, které objekty se budou odkládat z operační paměti. Framework poskytuje základní algoritmy. Jedná se o LRU a FIFO. Pokud uživateli nevyhovuje ani jeden z těchto algoritmů, může si pomocí připraveného rozhraní doimplementovat vlastní. Pokud není žádný z těchto algoritmů použit, bude se k vyrovnávací paměti přistupovat, jako by neměla omezenou kapacitu. Tento přístup obecně není nejvhodnější. Paměťové požadavky aplikace mohou nekontrolovaně růst a aplikačnímu serveru může dojít přidělená operační paměť.
  • Pokud je potřeba přechovávat paměť někde jinde než na pevném disku, stačí navrhnout nový posluchač (PersistenceListener), který umožní uchovat obsah paměti kdekoliv jinde. Může se například pomocí JDBC připojit do stejné i jiné databáze.
  • OSCache nabízí spoustu možností jak omezit platnost objektu ve vyrovnávací paměti. Objekty mohou být označeny za neplatné v těchto příadech
    • Dosáhnutí určitého věku
    • Periodické načtení objektu
    • Programové vyprázdnění paměti
    • Implementace vlastní politky jako přídavného modulu
  • Z důvodu lepší správy vyrovnávací paměti mohou být načtené objekty seskupovány. Tato možnost například umožňuje odstranit z paměti takové objekty, které vyhovují určitému vzoru klíče.
  • Cachovací systém je řízen pomocí událostí, které jsou vyvolávány při různých akcích. Těmito událostmi může být například přidání či odebrání objektu z paměti nebo samotný přístup k objektu v paměti.
  • V informačním systému může existovat několik vyrovnávacích pamětí, každá se svojí vlastní konfigurací.

Použití frameworku v aplikaci

Instalace

  • použité knihovny:
    • oscache-2.3.2.jar
    • commons-logging-1.0.4.jar
  • konfigurace pomocí oscache.properties, který musí být někde v dosahu classpath

JSP

  • URI Knihovny značek:
<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>

<cache></cache>

  • Hlavní tag OSCache. Tělo tagu bude cachováno podle zadaných atributů. Když je tag použit poprvé, jeho obsah se načte a uloží. Při každém znovupoužití se zkontroluje validita obsahu a buď se přímo vrátí načtený obsah nebo se obsah znovu načte.
  • Key

Klíč pod kterým je hodnota uložena ve vyrovnávací paměti. Měl by být jedinečný pro zadaný rozsah, jinak bude označovat stejný záznam. Není-li zadán použije se aktuální URI a query string. Pokud bude na stránce více tagů bez specifikovaného klíče, pro každý z tagů se k hodnotě klíče přidá index, aby se mezi nimi rozlišilo.

scope
Určuje rozsah platnosti cache. Přípustné hodnoty jsou session a application
time
Čas v sekundách po který je načtený obsah platný. Pokud je záporný, znamená to, že obsah se nikdy neoznačí za neplatný.
duration
Alternativa k atributu time. Hodnota může být jako SimpleDateFormat nebo jako řetězec datumu v ISO-8601
cron
Cronovský výraz, který určuje, kdy bude obsah paměti označen za neplatný v určitý den a čas.
mode
Pokud je nastavený na silent, obsah tagu nebude vypsán. Obsah paměti bude pouze načten.
groups
Položky v paměti mohou být libovolně seskupovány, na základě požadavků vyvíjeného systému. Seskupování je užitečné v okamžiku, kdy cachovaná data závisí na jiných aplikačních datech. Pokud se závislost změní, může se vyprázdnit právě závislá skupina dat.
language
Tento atribut umožňuje rozlišit mezi jazykovými mutacemi dat, které ovšem vystupují jinak pod stejným klíčem.
refreshpolicyclass
Třída, která rozšiřuje com.opensymphony.oscache.web.WebEntryRefreshPolicy a určuje, kdy je obsah vyrovnávací paměti určen za neplatný.
refreshpolicyparam
Atribut definuje parametry, které mají být poslány třídě definované v předchozím atributu.

Příklad

Hodnota systémových hodin se načte do vyrovnávací paměti a každých 10 respektive 5 sekund se záznam zneplatní a znovu načte. Jako klíč se použije současné URI a query string. Pokud bude na stránce více tagů bez specifikovaného klíče, pro každý z tagů se k hodnotě klíče přidá index, aby se mezi nimi rozlišilo.

 
<cache:cache time="10">
     <div>
        <%
            out.println(System.currentTimeMillis());
        %>
     </div>
</cache:cache>
        
<cache:cache time="5">
     <div>
        <%
            out.println(System.currentTimeMillis());
        %>
     </div>
</cache:cache>

<usecached />

Tento tag se může umístit uvnitř <cache> a slouží k určení, zda použít či nepoužít načtený obsah.

Příklad:

Tento kousek kódu je ukázka jak pomocí tagu implementovat toleranci k chybě.

 
<cache:cache>
     <% try { %>
          ... dynamický obsah jsp stránky ...
     <% } catch (Exception e) { %>
          <cache:usecached />
     <% } %>
</cache:cache>

Pokud během provádění obsahu jsp stránky nastane neočekávaná výjimka, použije se obsah vyrovnávací paměti.

<flush />

Tento tag slouží k vyprázdnění vyrovnávací paměti. Může být například umístěn na jsp stránce v administrační části aplikace. Správce se tak může rozhodnout, která z vyrovnávacích pamětí v aplikaci bude vyprázdněna.

scope
Určuje jaký rozsah bude vyprázdněn. Platné hodnoty jsou application, session a null, přičemž poslední atribut způsobí vyprázdění všech pamětí nezávisle na jejich rozsahu
key
Pokud je zadaný atribute scope, pak se z paměti odstraní položka pod zadaným klíčem. Bez atributu scope nemá key smysl.
group
všechny položky ve skupině budou z paměti odstraněny. Nemá smysl používat bez scope.
pattern
všechny položky s klíčem vyhovujícím vzoru a danému rozsahu (scope) budou označeny za neplatné. Tento atribut by se už neměl používat. Místo něj by se mělo používat seskupování položek, které poskytuje vyšší výkon.
language
Z vyrovnávací paměti odstraní jazykovou mutaci obsahu, který má jinak stejný klíč.

Příklad

Vyprázdnění všech vyrovnávacích pamětí v aplikaci

 
<cache:flush scope="application" />

Vyprázdnění položky s klíčem foobar v rozsahu session

 
<cache:flush scope="session" key="foobar" />

<addgroup />

Umožňuje přidat obsah cachovaného bloku do skupijny. Tento tag je výhodný v okamžiku, kdy jméno skupiny je známo, až v okažiku, kdy se blok provede.

Příklad

Přidá obsah bloku s klíčem test1 do skupin group1

 
<cache:cache key="test1"> 
     <cache:addgroup group="group1" />
         ... jsp ...
</cache:cache>

<addgroups />

Obdobně jako předchozí atribut umožňuje přidání bloku do skupin, které se v attributu groups oddělují čárkami.

Příklad

Přidá obsah bloku s klíčem test1 do skupin group1 a group2

 
<cache:cache key="test1">
     ... jsp ...
     <cache:addgroups groups="group1,group2" />
     ... jsp ...
</cache:cache>

API

Pro správu cache pamětí se používá třída GeneralCacheAdministrator. Tato třída zajišťuje vytváření, vyprazdňování a adminsitraci cache. Načítá cache.properties a vytváří instance pamětí na základě definic v tomto souboru.

Typické použití API

Pokud se objeví výjimka NeedsRefreshException musí se zavolat putInCache nebo cancelUpdate, aby se aplikace vyhnula deadlocku.

 
String myKey = "myKey";
String myValue;
int myRefreshPeriod = 1000;
try {
    // Nacteni z pameti
    myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);
} catch (NeedsRefreshException nre) {
     try {
         // Nacteni hodnoty – napr. Z databaze
         myValue = "This is the content retrieved.";
         // ulozeni do cache
         admin.putInCache(myKey, myValue);
     } catch (Exception ex) {
         // navrat k puvodni hodnote
         myValue = (String) nre.getCacheContent();
         // pokud nedojde ke zmene obsahu, musi se zavolat cancelUpdate
         admin.cancelUpdate(myKey);
     }
}

Servlet filter

OSCache obsahuje možnost načítat obsah výstupu servletu pomocí filtrů. Tento filtr umožňuje udržovat i binární data jako jsou například pdf nebo obrázky. Je to výhodné pokud by se stejná binární data měly generovat několikrát po sobě.

Definice filteru probíhá ve web.xml. Nastavení parametrů filtru se načítá z oscache.properties nebo se provádí pomocí inicializačních parametrů filtru. Základní nastavení je v rozsahu aplikace a po dobu jedné hodiny.

Obsah se bude cachovat pouze pokud má obsah status 200 (HttpServletResponse.SC_OK).

Pokud není nastavený IcacheKeyProvider, jako klíč se použíje URI requestu a query string.

Inicializační parametry

time
čas platnosti obsahu paměti v sekundách. Hodnota -1 znamená, že platnost obsahu nikdy nevyprší.
scope
Rozsah platnosti cache. Přípustné hodnoty jsou application a session. Pokud není parametr zadán platí cache v rámci celé aplikace
cron
Pomocí cron výrazu lze určit platnost aplikace


Příklad

Všechny jsp stránky se budou udržovat v paměti po dobu 10 minut v rozsahu session.

 
<filter>
    <filter-name>CacheFilter</filter-name>
    <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
    <init-param>
        <param-name>time</param-name>
        <param-value>600</param-value>
    </init-param>
    <init-param>
        <param-name>scope</param-name>
        <param-value>session</param-value>
    </init-param>
</filter>
 
<filter-mapping>
    <filter-name>CacheFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

Clusterování

OSCache nabízí podporu clusterování cache pamětí. Současná impplementace umožňuje použít JMS nebo JavaGroups jako protokol přenosu.

Obsahy pamětí se budují nezávisle na sobě. Pouze požadavky na vyprázdnění pamětí jsou zpracovávány. Tedy každý server má svoji cache a když přijde požadavek na vyprázdnění, jsou všechny odpovídající paměti na všech servrech označeny za neplatné.

JMS

JMS je standard pro zasílání zpráv, který umožňuje j2ee aplikacím vytvářet, posílat, příjmat a číst zprávy. Umožňuje distribuovanou asynchronní komunikaci.

OSCache vyžaduje JMS ConnectionFactory a Topic dostupné přes JNDI.

oscache.properties

cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroadcastingListener
JMS posluchač
cache.cluster.jms.topic.factory
JNDI název pro connection factory. Odpovídá názvu v JMS konfiguraci aplikačního serveru. Typicky něco podobného jako java:comp/env/jms/TopicConnectionFactory
cache.cluster.jms.topic.name
JNDI název pro topic, který bude oscache používat pro posílání zpráv. Odpovídá nastavení JMS v aplikačním serveru. Typicky: java:comp/env/jms/OSCacheTopic
cache.cluster.jms.node.name
jméno které jednoznačně identifikuje uzel v clusteru. Uzly jsou tak chráněny, aby zpracovávaly své vysílání.

Java Groups

Jedná se o framework pro podporu komunikace. Může být použit pro vytváření skupin procesů, které si mezi sebou mohou vyměňovat zprávy.

Do knihoven aplikace se musí připojit jgroups-all.jar

oscache.properties

cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener
JGroups posluchač

Pro záklaní nastavení stačí pouze výše zmíněný řádek. OSCache bude nyní vysílat požadavky na vyprázdnění po LAN. Při použítí více clusterů na stejné LAN je potřeba použít rozdílné multicast adresy (cache.cluster.multicast.ip v oscache.properties).

Nastavení

Nastavení celého frameworku se provádí pomocí souboru oscache.properties, který musí být umístěn někde, kde je vidět.

cache.capacity
Určuje počet objektů v paměti. Původní hodnota je neomezeno, což nemusí být pro systém výhodné. Proto je lepší nastavit tuto vlastnost na nějakou rozumnou hodnotu.
cache.algorithm
Algoritmus pro správu paměti. Cache.capacity musí být specifikováno. Pokud není nastaveno, pak má paměť neomezenou kapacitu a algoritmus pro správu nemá smysl.
  • com.opensymphony.oscache.base.algorithm.LRUCache
  • com.opensymphony.oscache.base.algorithm.FIFOCache
cache.blocking
Pokud jedno vlákno zrovna mění obsah položky vpaměti,pak druhé vlákno ve stejném okamžiku může k této položce přistupovat. Nastavenéí určuje, jakým způsobem se tak stane. Původní nastavení je false a určuje, že dokud nedojde ke změně, vrací se starý obsah položky. Nastavení true pak říká, že pokud probíhá update, pak všechna následující vlákna budou blokována a po ukončení updatu zase obnovena. První možnost je efektivnější, ale za cenu menší platnosti dat.
cache.unlimited.disk
Určuje zda se má cache na pevném disku považovat jako nekonečná. Pokud není zadána hodnota použije se cache.capacity
cache.persistence.class
Určuje třídu, která je zodpovědná za persistenci dat. Tato třída musí implementovat PersistenceListener Pro uchovávání dat na pevném disku slouží com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener. Implementací vlastního posluchače lze docílit například ukládání do databáze přes JDBC nebo může využít LDAP. Musí být nastavena vlastnost cache.path
cache.path
Určuje adresář ve kterém bude uchováván obsah paměti. Pokud není vytvořený, vytvoří se. OSCache musí mít práva pro zápis do tohoto adresáře. OSCache nemá mechanismus pro sdílení adresáře více pamětmi, proto je lepší pro každou paměť definovat svůj vlastní adresář.
cache.event.listeners
Určuje posluchače. Jednotlivé třídy jsou odděleny čárkou a musí implementovat alespoň jedno z rozhraní
  • CacheEntryEventListener - přijímá události o přidání, odebrání položky z paměti a vyčištění paměti
  • CacheMapAccessEventListener - přijímá události o přístupu do paměti. Je to výhodné pro zjišťování statistických údajů
  • implementované posluchače
    • com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener - podporuje clusterovaní. Pokud je aktivní vysílá do LAN infromace a vyprázdnění cache.
    • com.opensymphony.oscache.extra.CacheEntryEventListenerImpl - počet všech položek, které se v cache objeví během jejího lifetime
    • com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl - počet všech událostí, které se v cache objeví