Distribueret caching

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.

Comment