Monthly Archives: January 2010

AppFabric m Velocity distribueret cache

På et site som Arena365, som jeg bruger en del tid på, er der så mange små datachunks hist og pist at caching er en nødvendighed.

I starten er det fint nok at bruge den indbyggede HttpRunTime.Cache der gemmer data i applikationens IIS process, men hvis man har brug for at skalere ud til flere webservere kan være en fordel at have en central cache.

Velocity er microsofts bud på en distribueret cache. Andre kendte alternativer er kommercielle NCache eller open source varianten Memcached.

Velocity er en del af det som bliver markedsført som Windows Server AppFabric, og det er endnu et codename, som iflg ScottGU bliver erstattet af noget lidt mere enterprise-venligt senere. Windows Server AppFabric skal forstås som et samling af services som ligger ovenpå IIS’en og der findes også en AppFabric variant på Azure, som tilbyder nogle andre lidt mere mesh-agtige services.

Nå, men det er altså den distribuerede cache jeg kigger på her.

Hvis du ikke gider læse mere, skal du se denne session fra PDC09: Scaling Your Data Tier with Windows Server AppFabric

Anvendelsesmuligheder

Velocity kan med en enkelt linje i web.config plugges ind som session store. Og når session storage er afkoblet fra webserver processen åbner det op for nogle interessante muligheder ift skalering. Det er ikke meget anderledes end at bruge den gode gamle Session State Service, vi nok allesammen har haft fingrene i.

Man kan i øjeblikket ikke på samme måde lave en one-liner replacement af den almindelige HttpRuntime.Cache, så hvis den skal skiftes ud, er det lettest, hvis man i forvejen har pakket den funktionalitet ind.

I mit tilfælde havde vi i forvejen pakket den ind i en WebCache klasse, der implementerer et ICache interface med et passende antal metoder, så jeg lavede blot endnu en ICache implementation, VelocityCache, på 15 minutter og var i luften med det samme.

Output Cache kan ikke skiftes ud i øjeblikket, men bliver i Visual Studio 2010/ .Net 4 skrevet om til en Output Cache Provider, som Velocity vil kunne hooke ind i på samme måde som Session Store Provideren.

Vi bruger NHibernate på Arena365 og NHibernates 2nd level cache er pluggable med en mindre hær af forskellige cache providers, herunder også en til Velocity. Som jeg i skrivende stund ikke har afprøvet endnu, men mine erfaringer vil snart erstatte denne sætning.

Det kan være en enorm fordel på en udviklermaskine at have en cache-provider, der overlever builds og IIS restarts, og det kan over tid spare en for en del fingertrommen.

Installation/Opsætning

Denne post beskriver opsætningen af betaudgaven af Microsoft Distributed Cache, aka Velocity, som er en del af Microsoft AppFabric. (få den her)

Jeg oplevede et enkelt problem under installationen:

Problem 1: “Failed to apply Distributed Cache Configuration ”
Løsning 1: Opret en tom database i sqlserver og sørg for at brugeren NT AuthoritySystem er db_owner. Når du vælger at lægge konfigurationen i sql server under installationen, så tryk på “edit” og vælg derefter den tomme database.

Administrationen af Velocity gøres gennem en powershell console, så den starter man op (genvej i programs menuen)

Brug dette cheat sheet. Det dækker en CTP3-releasen, men virker også til Beta-versionen. Du kan også få hjælp indefra PowerShell med denne kommando:

PS>Get-CacheHelp

Nå, men start Velocity:

PS> Start-CacheCluster

Derefter kan du verificere at der er hul igennem med
PS> Get-Cache
- denne returnerer en enkelt række, cachen “default”

Og få en liste over cache hosts i dit cluster med
PS> Get-CacheHost

Så, nu er Velocity oppe at køre, vores cache server er i luften.
Det var første halvdel.

Når der er puttet items i din cache, kan du trække stats fra din “default” cache sådan her:

PS> Get-CacheStatistics default

Cache klienten

Start evt. med at downloade kode-samples.

Den nemmeste måde at konfigurere sin cache client på i et ASP.NET website (webforms eller MVC) er at smide et par linjer i sin web.config:

<!-- Velocity Cache Configuration -->

<section name="dataCacheClient" type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" allowLocation="true" allowDefinition="Everywhere"/>

<datacacheclient deployment="simple" timeout="150000">

<localcache isEnabled="true" sync="TTLBased" ttlValue="300" />

<hosts>

<host name="localhost" cachePort="22233" cacheHostName="DistributedCacheService"/>

</hosts>

</datacacheclient>

Nu kan du inde i din cache klasse initialisere cachen med

var cacheFac = new DataCacheFactory();
var cache = cacheFac.GetCache("default");
cache.CreateRegion("myregion", true);

Udfordringer

Et par ting jeg er stødt på.

Indtil videre understøtter Velocity ikke sliding expiration på cache items. Det skyldes at man ved hver cache access vil være nødt til at updatere timeouten på samme item i hele clusteret. Og det er ikke just definitionen af high performance. Det kan lade sig gøre at updatere timeout, men det er ret tydeligt for udvikleren, at det ikke er en gratis operation.

Cache Servicen kan ikke overleve sleep og hibernate på min windows 7 laptop. Det er lidt irriterende at man ikke bare kan have den kørende uden at skulle nurse den flere gange dagligt.

Links

AppFabric

Windows Server AppFabric Beta 1 Samples

PowerShell cheat sheet til CTP3

Session fra PDC09: Scaling Your Data Tier with Windows Server AppFabric