Xdolozil-jsr107

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

Úvod do problematiky

Internet ve své základní formě je v podstatě jenom série požadavků (request) a odpovědí (response). Uživatel pošle požadavek na server, ten vytvoří odpověď, kterou vrátí uživateli. Při vytváření odpovědi pracuje server se třemi typy objektů.

  • objekty, které se po vytvoření nikdy nemění
  • objekty, které se mění s každým požadavkem
  • všechny ostatní objekty, které nespadají do předchozích dvou kategorií

Java poskytuje dostatečný mechanismus pro práci s prvními dvěmi skupinami.V prvním případě lze vytvořit statický objekt, v druhém se při každém přístupu vytvoří nová instance objektu. Objekty v třetí kategorii jsou sdíleny a měněny mezi jednotlivými požadavky, procesy a uživateli. Pro efektivní práci s těmito objekty slouží specifikace Object Caching Service For Java (OCS4J).

OCS4J umožňuje sdílet objekty mezi požadavky, uživateli a řídí životní cyklus objektů v rámci procesů. Tento systém umožnuje práci s libovolným Java objektem. Vyrovnávací pamět při vkládání vytvoří obal objektu, kterému je přiřazeno jméno a je dostupný pro všechny vlákna procesu. Za vytvoření nového obaleného objektu je zodpovědný cachovací systém. Tyto pak můžou být explicitně označené za neplatné aplikací - například pomocí nastavení doby platnosti (TTL – Time To Live) nebo označení objektu za neplatný po určité době, po kterou nikdo k objektu nepřistoupil (Idle time). Pokud je objekt vyjmut z paměti nemusí se hned smazat, ale může být odložen na pevný disk. Zda se tak stane bude rozhodnuto na základě atributů, které jsou přiděleny objektu (resp. jeho obalu) při vložení do vyrovnávací paměti.Objelty v paměti mohou existovat samostatně nebo ve skupinách.

Aktualizace objektů neprobíhá přímo, ale je vytvořena nová verze objektu, která po dokončení úprav nahradí tu původní. Pro jednoduchost, dostupnost a výkon je objekt vyrovnávací paměti specifický pro každý proces. Při vytváření nového objektu cache neexistuje žádná kontrola. Avšak když se provádí zneplatnění nebo aktualizce existuje koordinace mezi jednotlivými procesy. Pokud se některá z těchto změn provede v jednom procesu, vyšle se ostatním instancím paměti zpráva o změně. Tímto způsobem zůstává celý systém procesů a instancí synchronizovaný.

Hlavním úkolem služby cachování je zvýšit výkon serveru při správě statických a nestatických java objektů. Cílem zlepšení výkonnosti je zmenšení počtu dotazů do databáze nebo jiných externích zdrojů tak, aby se zabránilo zbytečnému znovuvytváření objektů a aby se umožnilosdílení objektů mezi jednotlivými vlákny procesu a pokud možno mezi jednotlivými procesy.

Objektové cachování je navrženo pro obecné použití v libovolné aplikaci. Ke všem objektům v paměti se přistupuje pomocí jména. Tím může být libovolný java objekt, který překrývá metodu equals a hashCode. String je typickým příkladem tohoto objektu.

Z důvodu maximalizace systémových zdrojů jsou všechny objekty ve vyrovnávací paměti sdíleny. Přístup k nim ale není žádným způsobem serializovaný, čímž je umožněna vysoká úroveň současných přístupů. Objekty spravované pamětí v ní zůstávají tak dlouho, dokud na ně existuje nějaký odkaz. Pokud dojde k aktualizaci nebo zneplatnění objektu, nedochází k automatickému odstranění objektu z paměti, ale vytvoří se nová verze. Tímto způsobem může v sytému existovat několik verzí jednoho objektu, ale pouze jeden může být označen za aktuální. Starší verze existují tak dlouho, dokud se na ně nějaký jiný objekt odkazuje.

Objekty v paměti jsou sdílené a z toho důvodu nemohou být modifikovány přímo. Vytvoří se kopie objektu, která se modifikuje a potom se vrátí zpět do paměti. Tímto se vytvoří nová verze objektu.

Obecně mohou v paměti existovat dva typy objektů – lokální a distribuované. Aktualizace a zneplatnění objektů v lokální paměti není propagovámo mimo proces, zatímco pro distribouvané objekty obsahuje cachovací systém nástroje pro udržování objektů v distribuovaném prostředí na několika úrovních konzistence dat mimo paměť a jejich cachované podoby.

Objekty v paměti mohou být zneplatněny explicitně v aplikaci nebo automaticky pamětí na základě doby platnosti (TTL) nebo doby, po kterou k objektu nikdo nepřistupuje (idle time). Pokud je objekt označen atrubutem jako distribuovaný je tato změna propagována do ostatních vyrovnávacích pamětí.

Platné objekty jsou udržovány v paměti tak dlouho, pokud v ní existuje místo. Pokud paměť dosahuje své kapacity, platné objekty, na které není žádný odkaz, mohou být z paměti odstraněny. Objekty v operačním paměti mohou být spíše odloženy na disk než zcela odstraněny. Objekty ve vyrovnávací paměti na disku mohou být odstraněny také na základě omezení požadavků na místo, i když paměť na disku je mnohem větší než operační paměť, takže objekty se nebudou tak často odstraňovat. Objekty, které se označí za neplatné, jsou odebrány z operační paměti i z pevného disku pokud na ně neexistuje žádný odkaz.

Typy objektů

Pro organizaci objektů v rámci cache je definováno pět kategorií objektů

Objekt region

Tento typ se používá pro definování jmenného prostoru v cache. Každý objekt patří do nějakého regionu. Uživatel může definovat libovolný počet regionů, ačkoliv jeden region na aplikaci je dostačující.

Objekty v paměti

Objekty v paměti jsou uloženy v soukromé paměti procesu. Jsou typicky načítány z externího zdroje jako je například databáze. O vytváření těchto objektů se stará aplikace, cache za to není zodpovědná. Objekt může být z operační paměti odložen na disk, což je užitečné v okamžiku, kdy objekt je velký, je velmi drahé ho znovu vytvořit a jeho aktualizace neprobíhá příliš často. Objekty udržované na pevném disku mají větší tendenci zůstat ve vyrovnávací paměti než objekty v operační paměti. K nastavení chování objektů slouží atributy, kterými lze nastavit velké množství vlastností objektu.

Skupinové objekty

Skupinové objekty byly vytvořey ke sdružování jiných objektů. Takto spojené objekty mohou být řízeny jako celek. Každý objekt může být členem právě jedné skupiny a všechny objekty ve skupině musí být v jednom regionu.Atributy skupiny mohou byt aplikovány na skupinu jako celek nebo mohou být zděděny všemi objekty ve skupině. Větší prioritu než atributy skupiny mají pak atributy, které jsou nastaveny konkrértnímu členu. Objekty ve skupině mohou být označeny za neplatné individuálně nebo jako skupina. Zneplatnění skupiny způsobí zneplatnění všech neskupinových objektů. Pokud je ve skupině jiná skupina, pak ze zneplatnění provede kaskádově i na těchto objektech. Explicitní zneplatnění skupiny je propagováno do včech souvisejících vyrovnávacích pamětí na základě jména skupiny. Proto je důležité mít stejným systém skupin ve všech souvisejících pamětech. V současné době neexistuje žádný koncept pro aktualizaci skupiny jako celku. Všechny objekty musí být aktualizovány individuálně.

Skupinové objekty musí být explicitně vytvořeny před přidáním objektu. Skupiny se sami implicitně nevytvářejí.

Skupiny se typicky používají v případě kdy sdružené objekty jsou zneplatňovány společně nebo mají stejné atributy.

Diskové objekty

Diskové objekty jsou uloženy na pevném disku a je k nim přistupováno přímo z aplikace. Tyto objekty mohou být sdíleny všemy procesy serveru (uzlu) nebo mohou být pro jednotlivé procesy lokální. Aktualizace a zneplatnění probíhá stejným způsbem jako u paměťových objektů. Distribuované objekty na disku (i odložené objekty z operační paměti) přežijí i ukonení procesu v okamžiku, když je možné potvrdit platnost objektu v okamžiku, kdy se obnovený proces pokusí k dayům znovu přistoupit (napřklad po restartu aplikačního serveru). Platnost těchto objektů je založena na omezení času platnosti (TTL). Pokud není tento atribut specifiován objekty jsou považovány stále za platné.

Proudové objekty

K těmto objektům se přistupuje jako k proudům.Čtení pomocí OutputStream a zápis pomocí InputStream. Tento přístup může být pro některé objekty výhodný. Tento přístup umožňuje vyrovnávací paměti větší volnost, jak objekty ukládat. Menší objekty budou v operační paměti, zatímco větší budou uloženy na disk. Uživatel se nemusí starat, kde jsou objekty uloženy, protože k nim přistupuje přes InputStream. Proudové objekty mají stejné atributy jako diskové a paměťové objekty. Pokud má objekt přežít konec procesu, pak musí být obsah paměti explicitně uložen na disk. Systém neposkytuje žádnou záruku, že se tak bude dít automaticky. Proudové objekty neumožňují ukládat proudové objekty jako takové. Rozhraní InputStream a OutputStream jsou jenom používány jako přístupové metody objektům (potenciálně velmi velkým).

Atributy

Každému objektu v cache přísluší nějaké atributy. Tyto atributy ovlivňují, jakým způsobem se paměť k objektu chová v různých situacích. Následující atributy mohou být aplikací nastaceny.

Time to Live (životnost)

Atribut určuje jak dlouho zůstane objekt v cache. Po uplynutí této doby bude automaticky zneplatněn. Pokud je nastaven skupině nebo regionu, pak všechny objekty ve skupině nebo regionu budou označeny za neplatné až čas vyprší. Pokud nebude atribud nastaven, pak nedochází k automatickému zneplatněnění.

Default Time to Live (základní životnost)

Pouze skupinám nebo regionům může být nastaven tento atribut. Tento atribut je slouží jako implicitní hodnota pro TTL atribut nově vložených objektů. Větší váhu má hodnota TTL definovaná přímo atributu.

Group TTL Destroy

Pokud je tento atribut nastaven, pak se skupina při vypršení TTL také zruší. Implicitně se tak neděje.

Idle time (doba nečinnosti)

Atribut určuje dobu, po kterou nemusí nikdo k objektu v paměti přistoupit. Je-li tato doma překročena, pak dojde označení objektu za neplatný. Pokud je nastavený TTL, má doba nečinnosti menší prioritu. Atribut se používá pouze u samostatných objektů. Pokud je nastaven skupině nebo regionu, pak se nastavuje všem atributům ve skupině nebo regionu.

Distribouvané vs lokální

Objekt může být označen jako distribouvaný nebo lokální. V prvním případě je jsou aktualizace propagovány do ostatních cache v síti. Základní nastavení je lokální.

Vyžádání odpovědi

Při označení za neplatný nebo aktualizace distribouvaného objektu je očekávána zpráva ze vzdáleným cache o dokončení aplikace. Tento přístup se používá, pokud je vyžadována vysoká úroveň konzistence. Atribut se ignoruje pokud se jedná o lokální objekt.

Synchronizace aktualizace

Pokud se můžou aktualizace objevit na několika místech, může být potřeba je synchronizovat.

Okládání na disk

Objekt v cache v operační paměti nemusí být přímo odstraněn, ale může se odložit na disk. Atribut se týká pouze objektů v paměti, které implementují rozhraní Serializable. Pokud je objěkt distribuoavaný přežije zaniknutí procesu, který jej odložil. Lokální objekty jsou pouze na disku dostupné procesem, který jej vytvořil.

Původní objekt

Objekt se označuje za původní pokud byl přímo vytvořen v aplikaci (nebyl načten z nějakého externího zdroje). Tyto objekty nebudou odstraněny z paměti i v případě, kdy počet referencí klesne na nulu. Objekt může být odložen na disk, pokud je to povoleno. O zrušení objektu se stará aplikace, která o to musí explicitně požádat. Atributy jsou objektu nastaveny v okamžiku, kdy je vytvořen nebo vložen do cache. Atributy se dědí z regionu nebo skupiny. Tyto atributy pak mají nižší prioritu než atributy přímo nastavené objektu. U atributů, které nejsou obejktu nastaveny, se použije základní hodnota atributu. Tento objekt je lokální, bez TTL, bez Idle time, nebude se odkládat, je synchronizovaný a není původní.


Konvence jmen

Každá cache může být rozdělena do několika regionů.Každý region má své jméno a současně definuje jmenný prostor pro objekty, které do něj náleží.Každý objekt v regionu má své jméno. Kombinace jména regionu a jména objektu musí jednoznačně identifikovat objekt v rámci cache. Proto musí být jména regionů a jména objektů v rámci jednoho regionu vzájemně různá. Skupina objektů má sice své jméno, ale žádným způsobem nesouvisí se jmeným prostorem objektů. Je to pouze seskupení objektů se stejnými vlastnostmi. Typ objektu rovněž nesouvisí se jmenným prostorem. V jednom regionu nemohou mít skupina a objekt stejné jméno. Pro individuální objekty může být jako jméno použit jakýkoliv objekt, který má překryté metody Object.equals a Object.hashCode. Objekty by se neměly porovnávat podle odkazu.V drtivé většině případů se používá třída java.lang.String. Pro skupiny a regiony je restrikce pouze na String.

Konzistence distribouvané paměti

Cachovací služba může udržovat paměti v systému vzájemně konzistentní. Děje se tak pomocí broadcastové zprávy při rušení a aktualizaci objektu. Vyrovnávací paměť vyšle požadavek a na základě stupně konzistence čeká nebo nečeká na odpověď od ostatních pamětí.

Požadavky na funkcionalitu

Hlavním cílem cachovacího frameworku je poskytnout mechanismus, který bude spravovat instance Java objektů a který zvýší výkon aplikace. Uchovávání kopie objektu v paměti nebo na disku zajistí rychlejší odezvu aplikace při požadavku na tento objekt. Aplikace se tak můžde vyhnout drahému znovuvytváření nebo zjískávání objektu z databáze nebo jiného zdroje při každém požadavku. Aby byl tento požadavek zajištěn musí systém splňovat následující cíle:

  • jednoduchost použití
  • práce s libovolným Java objektem
  • objekt může být načten z libovolného zdroje
  • sdílení objektu v rámci procesu
  • základní použití by mělo být možné bez konfigurace nebo jenom s miniální konfigurací
  • musí být zachována konzistence mezi procesy
  • možnost indvalidovat skupinu objektů pomocí jedné operace
  • spravovat objekty jak v operačním paměti tak na pevném disku

Výkon

Pro využítí vyrovnávací paměti existuje spousta scénářů, ve kterých se používají java objekty různých typů.Nelze obecně říct, že pro každý z těchto scénařů přinese cachování stejné nebo dokonce konstantní zrychlení. Výkon závisí na rychlosti vytvoření nebo znovuzískání objektu a jaký je poměr čtení a zápisu. Čím dražší je objekt získat nebo vytvořit a čím větší je poměr čtení a zápisu, tím větší je užitek z cachovacího systému. Typickým příkladem je vytvoření objektu na základě dat získaných z databáze. I v tom nejjednodušším případě, kdy objekt reprezentuje jeden řádek malé tabulky, je při využití vyrovnávací paměti velmi velké zrychlení.

Dostupnost

Použití vyrovnávací paměti může vyřešit problémy, kdy je aplikace oddělena od svého zdroje dat (napřiklad při výpadku databáze). Díky kopiím objektů může aplikace pracovat lokálně do doby než se spojení obnoví.

Správa

Vyrovnávací paměť musí poskytnout API pro jednoduchou správu a umožniť jednotlivé operace monitorovat a poskytnout API k získání těchto statických údajů.

Jednoduchost použití

Použití vyrovnávací paměti by mělo být velice jednoduché a to zejména ze dvou hledisek. Prvním je jednoduchost poskytovaného API a druhým je integrovatelnost do stávajícího systému a možnost použití systému s nulovou konfigurací.

Typický příklad použití cache

Existuje velké množství aplikací, které by mohly využívat vyrovnávací paměť. Obecně řečeno každá aplikace, která pracuje s nestatickými daty, která jsou sdílena mezi vlákny a požadavky, může mít z cachování užitek.Typické příklady použití jsou uvedeny níže.

Správa konfigurace

Konfigurace aplikace by měla být známa pro všechny její procesy. Při inicializaci aplikace se konfigurace nahraje do vyrovnávací paměti. Distribouvané aktualizace a zneplatnění jsou použity pro udržení cache konzistentní.

Portál

Portál potřebuje spravovat uživatelské profily další objekty nutné pro jeho běh. Oba dva typy mohou být udržovány ve vyrovnávací paměti. Některé často používané objekty mohou být uloženy do paměti hned při startu portálu, jiné až při jeho běhu.

Servrové subsystémy

Servrový subsystém je například servletový kontejner. Jeho výkon může být zvýšen poolováním objektů jako je třeba požadavek nebo odpověď. Servlety jako takové mohou být uloženy ve vyrovnávací paměti. Skupinové zneplatnění může být použito v okamžiku, kdy se vyžaduje restart aplikace.

Cachování odpovědí

K zvýšení výkonu aplikace velice přispěje, když jsou v paměti udržovány odpovědi nebo jejich části, které jsou společené pro více požadavků.

Spolehlivost

Cachovací systém nesmí mít negativní vliv na běh aplikačníhoserveru. Pokud je použit, může zvýšit spolehlivost správy java objektů.

Logování

Cache vedle své základní funkcionality, správy java objektů, nabízí i logovací subsystém. S jeho pomocí je snadnější objevit vzniklé problémy. Tato část je navržena jako rozhraní, což ji umožňuje začlenit se do stávajícího logovacího systému, který aplikační server nebo aplikace podporuje.

Bezpečnost

Bezpečnost se zcela přenechává na uživateli. Neprobíhá žádná autorizace ani autentifikace. Při distribuované paměti není přenos kódovaný. Tato funkcionalita se předpokládá v dalších verzích specifikace.