Windows Azure - failide kasutamine pilvedes
30.11.2009 | Gunnar
Azure pilveteenuste proovimise käigus proovisin pilvedesse viia rakenduse, mis kasutab andmete hoidmiseks failina salvestatud DataSeti. Pilvedes ei ole lubatud lokaalsele kettale failide salvestamine ning failihoidlana tuleb kasutada cloud storage teenust. Järgnevalt väike näide selle kohta, kuidas hoidlast faile lugeda ja neid sinna kirjutada.
Infoks veel nii palju, et pilveteenuste avamisel peaks piirangud minema praegusest oluliselt lõdvemaks, kuna praegu ei saa veebirakendusega samas serveris kasutada ka kettalt laetavaid SQL Serveri andmebaase. Sellest hoolimata jääb arvatavasti peamiseks stiiliks ikkagi see, et andmebaasid asuvad pilvebaasis mitte rakendusserveri kõvakettal.
Eeltöö
Alustuseks on vaja Windows Azure kontot, kus tuleb luua uus veebirakendus ja uus cloud storage konto. Windows Azure CTP programmiga saab liituda siin.
Proovimiseks piisab lihtsast veebirakendusest. Soovitan kasutada tavalist ASP.NET Forms põhist rakendust, kuna selle jaoks on kõik vajalik pilveteenustes juba ees olemas. MVC põhisega rakendusega tuleb ise mõned DLL-id kaasa panna, sest vaikimisi Windows Azure hetkel ASP.NET MVC raamistikku ei toeta. Loomulikult on vaja ka Windows Azure jubinaid Visual Studio jaoks.
Kui rakendus on olemas, siis tuleb sellele külge haakida selline teek nagu StorageClient. StorageClient.dll tuleb kaasa Windows Azure näidetega ja kui muidu seda ei leia, siis võib seda otsida kettalt, kuhu Visual Studio on installitud. Sellega on kõik eeltöö tehtud ja nüüd võib asuda failide lugemise ja kirjutamise kallale.
Hoidlaga ühendumine
Et meil on nii faili lugemiseks kui ka kirjutamiseks vaja hoidla konteinerit, siis saame hoidlaga ühendumise ja konteineri küsimise koondada ühte meetodi. Et StorageClient selles kohas IDisposable liidest järgivaid klasse ei kasuta, siis on ülesanne eriti lihtne.

Kõrvaloleval pildil on näha lihtne näide cloud storage konto sisust. Konto on kõige kõrgem tase. Selle alla kuulub konteiner. Konteiner on nagu kataloog, kuhu saab faile kirjutada.
Konteineri sisuks on BLOBid (Binary Large OBject) ehk siis suvalise struktuuriga baidijadad, mis võivad olla väga-väga pikad. Pilveteenus neid peenemalt kuidagi ei käsitle ja see pole ka tema ülesanne. Pildil toodud näites on loodud konto, mille tinglikuks nimeks on _blob. Selle konto all on konteiner nimega dataset ja selles asub BLOB nimega Data.xml.
Aga vaatame nüüd näidet ka.
Hoidlaga ühendumiseks on meil vaja teada hoidla aadressi, konto nime ja võtit. Need andmed saab kätte cloud storage teenuse haldamise liidese kaudu.
Faili lugemine
Faili saame DataSeti laadida sellise koodi abil, mis küsib hoidlast Data.xml nimelise BLOBi, loeb selle mällu ja laseb DataSetil siis mälust andmed sisse laadida.
{
var container = GetContainer();
using (var mem = new MemoryStream())
{
if (!container.DoesBlobExist("Data.xml"))
return;
var fileBlob = new BlobContents(mem);
container.GetBlob("Data.xml", fileBlob, true);
var stream = fileBlob.AsStream;
// Vajalik - streami pointer ei asu streami alguses
stream.Seek(0, SeekOrigin.Begin);
data.ReadXml(stream);
}
}
Faili kirjutamine
Kirjutamine on aga pisut pikem protseduur, kuigi mitte oluliselt. Kirjutamisel anname BLOBile kaasa ka metaandmed ja mõned lihtsad omadused, mis teevad BLOBi kasutamise erinevatele klientrakendustele teinekord lihtsamaks.
{
var container = GetContainer();
if (container.DoesBlobExist("Data.xml"))
container.DeleteBlob("Data.xml");
var metadata = new NameValueCollection();
metadata["FileName"] = "Data.xml";
var properties = new BlobProperties("Data.xml")
{
Metadata = metadata,
ContentType = "text/xml"
};
using(var mem = new MemoryStream())
{
data.WriteXml(mem);
var fileBlob = new BlobContents(mem.ToArray());
container.CreateBlob(properties, fileBlob, true);
}
}
Ja ongi olemas. Sõltuvalt DataSeti hoidmisest ja laadimisest saab programmeerija ise otsustada, et millal on õige aeg andmete laadimiseks ja salvestamiseks. Vajadusel võib need meetodid viia ka mõnda helper-klassi, sest nii primitiivse liidese korral pole mõtet enamaga üle pingutada.
Kokkuvõtteks
Andmete lugemine pilve pealt ja andmete kirjutamine sinna pole keeruline tegemine. Ilma erilise pingutuseta saab kätte vajalikud kontod, nende seadistamine on lihtne ja StorageClient abil saab ka kõik muud vajalikud liigutused ära teha.
Loomulikult on viisakas see, kui valida andmete hoidmiseks selleks sobiv formaat (pilveteenustel on neid kolm: Table, Queue ja Blob). Siin näites keskendusin ma BLOBidele, mis sobivad nii suurte (nagu näiteks varukoopiad, videod, DVD-tõmmised jne) kui ka pisikeste failide hoidmiseks ja ma arvan, et siin toodud koodi saab kasutada päris paljudel juhtudel, kui failid asuvad pilveteenuses.
