I forbindelse med udarbejdelsen af et større system, har
skalerbarhed været en bekymring. Systemet ligger i Azure og kan som
sådan skalere ud uden de store problemer. Det er altså ikke
antallet af servere (CPU-kraft) der er problemet, men derimod
adgang til data. Mange forspørgsler går igennem databasen og dermed
er der stor risiko for at databasen bliver flaskehalsen i dette
setup.
Caching er naturligvis den oplagte løsning, men der er dog nogle
udfordringer med den indbyggede cache i ASP.NET, da denne ikke får
mig hele vejen i mål. Dette er naturligvis fordi den cache er lokal
på hver server og dermed kun rigtig brugbar til data der eksklusivt
skal læses og som ikke ændrer sig særlig ofte. Data der skal
opdateres vedligeholdes bedst i en centraliseret cache, dvs.
distribueret cache. Sådan en findes der heldigvis også i Windows
Azure AppFabric og den kan afhjælpe dette problem. Dette er dog en
lidt anden caching-model end den indbyggede Cache, da en
distribueret cache stiller mig over for nogle nye udfordringer.
Jeg har, i forbindelse med min research på emnet, fundet frem
til en artikel, der omhandler caching og de faldgruber man skal
være opmærksom på, når man benytter en distribueret cache. Nogle af
de, for mig, mest fremtrædende pointer jeg tog med mig fra artiklen
var følgende:
* Caching sker af kopier af objektet. I
modsætning til en lokal cache, hvor det er en reference til
objektet der caches, er det en kopi af et objekt der caches i en
distribueret cache. Dette skyldes at cachen typisk ligger out of
process og ofte på en helt anden fysisk maskine.
* Samtidighed er en udfordring. At der
arbejdes med kopier af objekter kan bla. betyde at opdateringer af
et objekts egenskaber, kan risikere at ske fra flere fronter på
samme tid og dermed give nogle konsistensproblemer, hvis man ikke
er forsigtig (objektet i cachen skal låses fra læsning til
tilbageskrivning).
* Caching af store objekter kan sløve
systemet. Da der sker en serialisering/deserialisering af
objektet når det skrives til/læses fra cachen, kan der være store
CPU-omkostninger forbundet med at læse og skrive data til en cache.
Derfor bør man cache komplekse objekter og objektstrukturer med
stor omtanke.
Artiklen "Ten Caching
Mistakes That Will Break Your App" beskriver dette og
flere andre aspekter vedr. distribueret caching i dybden.
Jeg vil i øvrigt opfordre til at kigge på nogle af de andre
artikler af samme forfatter. Der er noget god viden at hente
angående optimering af ASP.NET løsninger.