Knyga: Microsoft Windows Azure Development Cookbook

Parašė Sergejus | 2011-10-23 13:43

Prieš kurį laiką rašiau, kad pradėjau skaityti knygą Microsoft Windows Azure Development Cookbook, kurią parašė mano pažįstamas, Windows Azure MVP Neil Mackenzie.

Kas man patiko knygoje, mažai dėmesio skiriama bendroms debesų kompiuterijos temoms, kodėl tai yra svarbu ir panašiai, o iš karto pereinama prie Windows Azure. Autorius pradeda nuo kiek netikėtos temos – saugumo. Jis aprašo skirtingus būdus kaip galima prieiti prie platformos bei kaip apriboti kitų prieigą. Toliau Neil labai detaliai aprašo Windows Azure BLOB, Table ir Queue saugyklas. Norėtųsi atkreipti dėmesį, aprašomas ne tik funkcionalumas (kaip daugelyje kitų knygų), bet ir greitaiveika! Tuo man knyga ir patinka – savo praktiškumu. Po saugyklų apžvalgos, autorius pereina prie tokių Windows Azure galimybių kaip: local storage ir startup task, kelių Web aplikacijų talpinimas, Web Deploy technologijos panaudojimas, Windows Azure Connect VPN prisijungimas ir kitų galimybių.

Šiam momentui, jus žinosite pakankamai, kad galėtumėte pradėti kurti Windows Azure aplikacijas. Galimoms problemoms spręsti, knygoje yra visas skyrius skirtas diagnostikai. Kadangi visas Windows Azure valdymas paremtas specialiu Service Management API, autorius aprašo kaip naudotis ir juo. Tokiu būdu jus efektyviai galėsite valdyti virtualių mašinų kiekį, daryti atnaujinimus ir panašius veiksmus tiesiai iš PowerShell.

Knygos pabaigoje jus galėsite sužinoti apie SQL Azure bei Windows Azure AppFabric. Apart paprasto teorinio aprašo, SQL Azure dalyje rasite ir praktinių patarimų kaip apdoroti prisijungimo problemas bei panaudoti BLOB saugyklą kartu su SQL Azure.

Apibendrinant, manau knyga turi labai gerą balansą tarp teorijos ir praktiškumo. Knyga nėra stora (392 puslapiai), bet turi visą reikalingą informaciją apie Windows Azure ir susijusius produktus, tad jeigu ieškote efektyvaus būdo pradėti programuoti Windows Azure – tikrai galiu rekomenduoti Microsoft Windows Azure Development Cookbook.

Rodyk draugams

Savaitės video – Moving Application to The Cloud

Parašė Sergejus | 2011-09-28 20:57

Šios savaitės video – aš pasakoju apie aplikacijų migravimą į debesis.

Rodyk draugams

Knyga: Microsoft Windows Azure Development Cookbook

Parašė Sergejus | 2011-09-17 16:19

Tradiciškai, šiame tinklaraštyje galėjote rasti įvairius technologinius straipsnius, įspūdžius iš konferencijų ir panašiai. Prieš kelias savaites pradėjau rubriką savaitės video, o šiandien nusprendžiau pradėti dalintis ir perskaitytų knygų recenzijomis (beje, skaitymui naudoju Amazon Kindle).

Šiuo metu užbaiginėju skaityti Microsoft Windows Azure Development Cookbook, tad knygos recenzija jau greitai!

Rodyk draugams

Skaidrės iš mano pristatymo Moving Applications to the Cloud

Parašė Sergejus | 2011-02-20 22:08

Powered by MVP konferencijoje dariau pagrindinį pristatymą programuotojams ir IT profesionalams iš programų migravimo į debesį. Ačiū visiems už dalyvavimą ir įdomius klausimus!

Rodyk draugams

Pingy - #8 PingReportItem ir PingReportRepository

Parašė Sergejus | 2010-12-22 23:06

Primenu, Pingy – tai mano bandymas sukurti paslaugą, kuri kas tam tikrą laiką kreiptųsi į vartotojo nurodytą URL, taip neduodant IIS užmigti. Tuo pačiu metu bus renkama statistika apie serverio būseną, atsakos laikas ir pan. Pingy yra kuriamas specialiai Windows Azure mokymosi tikslais.

Turinys

Pingy - #1 Architektūra
Pingy - #2 Windows Azure Table ir NoSQL mąstymas
Pingy - #3 PingItem ir PingItemRepository
Pingy - #4 PingItem repozitorijos atnaujinimas metodu GetItemsByPeriod
Pingy - #5 Windows Azure Queue ir PingTaskRepository
Pingy - #6 Windows Azure Queue korektiškas žinučių apdorojimas
Pingy - #7 Pinger serviso kūrimas
Pingy - #8 PingReportItem ir PingReportRepository

Praeitoje dalyje mes sukūrėme Pinger servisą, kuris atlieka pagrindinę Pingy aplikacijos logiką – kreipiasi į nurodytus URL ir tikrina, ar serveris yra pasiekiamas. Šio kreipimosi rezultatas buvo talpinamas į PingReportRepository repozitoriją, kurią mes šioje dalyje ir įgyvendinsime.

PingReport esybės

Kaip ir PingItem atveju, pirma aprašysime modelį PingReportItem:

public class PingReportItem
{
    public string Client { get; set; }
    public string Url { get; set; }
    public DateTime CollectedOn { get; set; }
    public int StatusCode { get; set; }
    public TimeSpan ResponseTime { get; set; }
}

StatusCode – tai HTTP atsakymo kodas, o ResponseTime – laiko intervalas, per kiek mes gavome atsakymą iš serverio. Kadangi saugojimui naudosime Windows Azure Table Storage, pagal analogiją su PingItem būtina aprašyti esybę PingReportEntity:

public class PingReportEntity : TableServiceEntity
{
    public string Url { get; set; }
    public DateTime CollectedOn { get; set; }
    public int StatusCode { get; set; }
    public long ResponseTime { get; set; }
}

Atkreipkite dėmesį, kad šioje esybėje kliento pavadinimas bus naudojamas kaip PartitionKey, o RowKey bus sudarytas iš trejeto Client, Url ir CollectedOn. Paprastesniam darbui su PingReportItem ir PingReportEntity aprašykime konverterį:

public static class PingReportConverter
{
    public static PingReportItem ToPingReportItem(this PingReportEntity entity)
    {
        return new PingReportItem
        {
            Client = entity.PartitionKey,
            Url = entity.Url,
            CollectedOn = entity.CollectedOn,
            StatusCode = entity.StatusCode,
            ResponseTime = TimeSpan.FromMilliseconds(entity.ResponseTime)
        };
    }

    public static PingReportEntity ToPingReportEntity(this PingReportItem reportItem)
    {
        return new PingReportEntity
        {
            PartitionKey = reportItem.Client,
            RowKey = String.Format("{0}_{1}_{2}", reportItem.Client, reportItem.Url.SanitizeUrl(),
                                                  reportItem.CollectedOn.ToFileTimeUtc()),
            Url = reportItem.Url,
            CollectedOn = reportItem.CollectedOn,
            StatusCode = reportItem.StatusCode,
            ResponseTime = (long)reportItem.ResponseTime.TotalMilliseconds
        };
    }
}

PingReportRepository įgyvendinimas

PingReportRepository realizacija labai panaši į PingItemRepository:

public class PingReportRepository : IPingReportRepository
{
    private readonly CloudStorageAccount account;
    private readonly string pingReportEntityTable = typeof(PingReportEntity).Name;

    public PingReportRepository(CloudStorageAccount account)
    {
        this.account = account;

        var client = account.CreateCloudTableClient();
        client.CreateTableIfNotExist(pingReportEntityTable);
    }

    public IEnumerable<PingReportItem> GetClientReportItems(string client)
    {
        return CreateContext().CreateQuery<PingReportEntity>(pingReportEntityTable)
                              .Where(e => e.PartitionKey == client)
                              .AsTableServiceQuery()
                              .Execute()
                              .Select(e => e.ToPingReportItem());
    }

    public void AddReportItem(PingReportItem item)
    {
        var context = CreateContext();

        var pingReportEntity = item.ToPingReportEntity();
        context.AddObject(pingReportEntityTable, pingReportEntity);
        context.SaveChanges();
    }

    public void RemoveClientReportItems(string client)
    {
        var context = CreateContext();

        var entities = context.CreateQuery<PingReportEntity>(pingReportEntityTable)
                              .Where(e => e.PartitionKey == client)
                              .AsTableServiceQuery()
                              .Execute()
                              .ToList();

        foreach (var entity in entities)
        {
            context.DeleteObject(entity);
        }
        context.SaveChanges();
    }

    protected TableServiceContext CreateContext()
    {
        return new TableServiceContext(account.TableEndpoint.ToString(), account.Credentials);
    }
}

Kitoje dalyje…

Šioje dalyje mes aprašėme paskutinę pirmai iteracijai reikalingą repozitoriją PingReportRepoository ir su ja susijusias klases. Kitoje dalyje įgyvendinsime dar vieną Worker rolę – PingScheduler, atsakingą už kreipimosi į nurodytus URL užduočių sukūrimą bei valdymą.

Rodyk draugams

Pingy - #7 Pinger serviso kūrimas

Parašė Sergejus | 2010-12-04 16:28

Primenu, Pingy – tai mano bandymas sukurti paslaugą, kuri kas tam tikrą laiką kreiptųsi į vartotojo nurodytą URL, taip neduodant IIS užmigti. Tuo pačiu metu bus renkama statistika apie serverio būseną, atsakos laikas ir pan. Pingy yra kuriamas specialiai Windows Azure mokymosi tikslais.

Turinys

Pingy - #1 Architektūra
Pingy - #2 Windows Azure Table ir NoSQL mąstymas
Pingy - #3 PingItem ir PingItemRepository
Pingy - #4 PingItem repozitorijos atnaujinimas metodu GetItemsByPeriod
Pingy - #5 Windows Azure Queue ir PingTaskRepository
Pingy - #6 Windows Azure Queue korektiškas žinučių apdorojimas
Pingy - #7 Pinger serviso kūrimas
Pingy - #8 PingReportItem ir PingReportRepository

5 dalyje mes esame aprašę PingTaskRepository, o praeitoje dalyje sužinojome kaip korektiškai daryti Windows Azure Queue žinučių apdorojimą. Šioje dalyje mes tai apjungsime į vieną visumą įgyvendinant Pinger servisą.

Pinger servisas

Pinger servisas – tai Class Library tipo projektas, kuris bus vykdomas Windows Azure Worker rolėje. Kiekviena Worker rolė privalo paveldėti iš RoleEntryPoint klasės, kurioje mes aprašysime du veiksmus: OnStart in Run. Pirmajame metode turi būti aprašomi visi veiksmai, kurie turi būti atlikti vieną kartą startuojant servisui, o antrajame – serviso verslo logika. Supaprastintai, Pinger serviso WorkerRole klasė atrodys taip:

public class WorkerRole : RoleEntryPoint
{
    private const int DequeueThreadhold = 5;
    private static readonly TimeSpan SleepInterval = TimeSpan.FromSeconds(60);

    private IPingTaskRepository pingTaskRepository;
    private IPingReportRepository pingReportRepository;

    public override bool OnStart() { }

    public override void Run() { }
}

Kaip tikriausiai pastebėjote, mes naudojame dvi repozitorijas: PingTaskRepository bei PingReportRepository. Pastarosios realizaciją pateiksiu kitoje dalyje. Konstantos DequeueThreadhold ir SleepInterval bus reikalingos korektiškam žinučių apdorojimui.

Metodas OnStart

Metode OnStart mes atliekame 4 pagrindinius veiksmus:

  • Nusakome kaip reaguoti į pasikeitimus Windows Azure rolės konfigūracijoje (pasikeitimai nebus iš karto pritaikomi rolei)
  • Nurodome iš kur skaityti konfigūracijos nustatymus (iš Windows Azure projekto ServiceDefinition failo)
  • Sukuriame Windows Azure Storage Account pagal nustatymus konfigūraciniame faile
  • Sukuriame prieš tai minėtas repozitorijas
public override bool OnStart()
{
    // Are any of the environment changes a configuration setting change? 
    // If so, cancel the event and restart the role
    RoleEnvironment.Changing += (sender, e) =>
        e.Cancel = e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange);

    // Provide the configSetter with the initial value
    CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
        configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)));

    var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    pingTaskRepository = new PingTaskRepository(account);
    pingReportRepository = new PingReportRepository(account);

    return base.OnStart();
}

Metodas Run

Metodas Run įgyvendina praeitoje dalyje aprašyta žinučių apdorojimo šabloną:

  • Verslo logiką vykdomą pastoviai (while true)
  • Bandoma gauti PingTask objektą iš repozitorijos (eilės)
  • Jeigu pavyksta – vykdomas tolesnis darbas
  • Jeigu ne (eilėje nėra nei vienos užduoties) – laukiam SleepInterval laiką
  • Galiausiai, jeigu klaidų nebuvo arba buvo aptikta kenkėjišką žinutė – ją ištriname iš repozitorijos (eilės)

Trinant žinutę gali iškilti situacija, kad ji jau buvo ištrinta – tokias situacijas tiesiog ignoruojame

public override void Run()
{
    while (true)
    {
        PingTask task = null;
        var success = false;

        try
        {
            task = pingTaskRepository.GetTask();

            if (task != null)
            {
                var request = WebRequest.Create(task.PingItem.Url);
                var stopwatch = Stopwatch.StartNew();
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    stopwatch.Stop();
                    var item = new PingReportItem
                    {
                        Client = task.PingItem.Client,
                        Url = task.PingItem.Url,
                        CollectedOn = DateTime.UtcNow,
                        StatusCode = (int)response.StatusCode,
                        ResponseTime = TimeSpan.FromMilliseconds(stopwatch.ElapsedMilliseconds)
                    };

                    pingReportRepository.AddReportItem(item);
                }

                success = true;
            }
            else
            {
                Thread.Sleep(SleepInterval);
            }
        }
        catch (Exception)
        {
            // TODO: Log exception
            success = false;
        }
        finally
        {
            if (success || task != null && task.DequeueCount > DequeueThreadhold)
            {
                try
                {
                    pingTaskRepository.DeleteTask(task);
                }
                catch (StorageClientException ex)
                {
                    if (ex.ExtendedErrorInformation.ErrorCode == "MessageNotFound")
                    {
                        // Pop receipt must be invalid
                        // TODO: Log, so we can tune the visibility timeout
                    }
                    else
                    {
                        // TODO: Log
                    }
                }
            }
        }
    }
}

Kitoje dalyje…

Šioje dalyje parodžiau kaip sukurti Windows Azure Worker rolę, kitoje įgyvendinsime šioje dalyje panaudotą PingReportRepository.

Rodyk draugams

Windows Azure SDK 1.3 ir naujasis Windows Azure Platform portalas jau prieinami

Parašė Sergejus | 2010-11-30 20:56

Lygiai prieš savaitę rašiau apie Windows Azure naujoves, o šiandien dalis minėtų galimybių tapo prieinama viešai, o dalis – beta testuotojams.

Naudingos nuorodos:

Windows Azure SDK and Windows Azure Tools for Microsoft Visual Studio (November 2010)
Windows Azure Platform Training Kit - November Update
Windows Azure komandos straipsnis apie SDK1.3 naujoves ir naują portalą

Tiems kam smalsu, bet neturi prieigos prie Windows Azure, žemiau pateikiu naujojo Windows Azure Platform portalo paveiksliuką

azure-portal1

Rodyk draugams

Windows Azure naujovės paskelbtos Microsoft PDC konferencijos metu

Parašė Sergejus | 2010-11-23 22:44

Kaip žinia, beveik prieš mėnesį vyko programuotojų konferencija Microsoft PDC, kurios metu buvo anonsuota daug Windows Azure naujovių. Kadangi jau greitai prasidės pirmoji naujovių paleidimo banga, nusprendžiau trumpai aprašyti kas apskritai atsiras naujo.

Windows Azure naujovės

Įvairūs patobulinimai

  • Naujas, pilnai perdarytas su Silverlight technologija, Windows Azure portalas
  • Galimybė RPD (Remote Desktop Connection) pagalba per nuotolį prisijungti prie Windows Azure virtualios mašinos
  • Pilnas IIS palaikymas, t.y. galimybė sukurti kelis Web saitus ir instaliuoti IIS modulius
  • Galimybė leisti programas ir procesus administratoriaus teisėmis
  • Prieiga prie dar daugiau diagnostinės informacijos
  • Windows Azure SDK 1.3
  • Daug geresnis Java palaikymas

Nauja Windows Azure Virtual Machine rolė

Šalia jau esamų Web ir Worker rolių, atsiras nauja VM rolė, kuri įgalins egzistuojantį Hyper-V virtualios mašinos vaizdą įkelti į Windows Azure ir naudotis iš anksto sukonfigūruota mašina.

Naujas Windows Azure virtualios mašinos dydis

Mažų apimčių užduotims atlikti atsiras specialus virtualios mašinos dydis Extra Small.

CPU: 1 GHz
RAM: 768 MB
HDD: 20 GB
Kaina: $0.05

Windows Server 2008 R2 palaikymas

Šiuo metu naudojama Windows Azure Guest OS 1.X yra grindžiama Windows Server 2008. Artimiausiu metu pasirodys nauja Windows Azure Guest OS 2.X versija, kuri bus paremta Windows Server 2008 R2. Kartu su R2 galima bus pasinaudoti ir visomis IIS 7.5 galimybėmis.

Windows Azure Virtual Network

Dažna debesų kompiuterijos problema - debesyje esančių aplikacijų apjungimas su įmonės tinkle esančiais duomenimis. Vienas iš sprendimų būtų pasinaudoti Windows Azure AppFabric Service Bus protokolų tuneliavimu ir kitomis technikomis. Kitas sprendimas - Windows Azure Virtual Network, leidžiantis apjungti jūsų tinklą su Windows Azure aplikacijomis VPN (Virtual Private Network) pagalba.

Windows Azure Storage patobulinimai

Dinaminis turinio kešavimas

Šiuo metu Windows Azure CDN (Content Delivery Network) palaiko tik statinį kešavimą, t.y. gali kešuoti tik statinius failus išsaugotus Windows Azure BLOBe. Dinaminis kešavimas įgalins duomenų, grąžinamų iš Windows Azure aplikacijų, kešavimą.

CDN SSL palaikymas

Dabartinis Windows Azure CDN palaiko išskirtinai HTTP protokolą, naujoje versija bus palaikomi abu HTTP(S) protokolai.

SQL Azure naujovės

SQL Azure Reporting

Šiuo metu SQL Azure palaiko tik pagrindines SQL Server variklio galimybes. Viena iš naujovių – SQL Azure Reporting, kuri yra paremta daugeliui gerai žinomais SQL Server Reporting Services. Tai leis egzistuojančius RDL failus talpinti Azure platformoje ir kurti ataskaitas duomenims iš SQL Azure duomenų bazės.

SQL Azure Data Sync

Ši galimybė nėra visiškai nauja ir jau kurį laiką buvo prieinama CTP versijoje. SQL Azure Data Sync paremta Microsoft Sync Framework 2.0 ir leidžia sinchronizuoti SQL Azure duomenų bazes su jūsų lokaliomis DB.

Database Manager for SQL Azure

Anksčiau žinomas kaip Project Huston. Supaprastinta SQL Server Management Studio versija paremta Silverlight technologija. Leidžia atlikti pagrindinius veiksmus su SQL Azure duomenų bazėmis.

Windows Azure AppFabric naujovės

Windows Azure AppFabric Caching

Ne kartą esu rašęs apie Project Velocity, dabar žinomą kaip Windows AppFabric Caching – paskirstytą kešavimo mechanizmą. Windows Azure AppFabric Caching tai yra Windows Azure platformai skirta Velocity versija, leidžianti pasinaudoti kešavimu kaip paslauga.

Windows Azure AppFabric Access Control

Antroji Access Control versija pasižymi palaikomų autentifikavimo provaiderių gausa:

  • Windows Live ID
  • Google
  • Facebook
  • Active Directory Federation Services

Rodyk draugams

Pingy - #6 Windows Azure Queue korektiškas žinučių apdorojimas

Parašė Sergejus | 2010-11-09 12:00

Primenu, Pingy – tai mano bandymas sukurti paslaugą, kuri kas tam tikrą laiką kreiptųsi į vartotojo nurodytą URL, taip neduodant IIS užmigti. Tuo pačiu metu bus renkama statistika apie serverio būseną, atsakos laikas ir pan. Pingy yra kuriamas specialiai Windows Azure mokymosi tikslais.

Turinys

Pingy - #1 Architektūra
Pingy - #2 Windows Azure Table ir NoSQL mąstymas
Pingy - #3 PingItem ir PingItemRepository
Pingy - #4 PingItem repozitorijos atnaujinimas metodu GetItemsByPeriod
Pingy - #5 Windows Azure Queue ir PingTaskRepository
Pingy - #6 Windows Azure Queue korektiškas žinučių apdorojimas
Pingy - #7 Pinger serviso kūrimas
Pingy - #8 PingReportItem ir PingReportRepository

Šioje dalyje, kaip ir žadėjau, aptarsime pagrindines problemas, kurios gali kilti apdorojant Windows Azure Queue pranešimus bei pateiksiu korektišką žinučių apdorojimo šabloną.

Žinučių apdorojimo scenarijai

Kaip jau rašiau, eilės leidžia logiškai atskirti servisus-gamintojus nuo apdorojimo servisų, taip suteikiant gerą plečiamumą (angl. scalability). Windows Azure Queue reikalauja, kad apdorojimo servisai:

  • galėtų korektiškai apdoroti tą patį pranešimą kelis kartus
  • nepriklausytų nuo apdorojamų žinučių eiliškumo

Išnagrinėkime kelis išskirtinius žinučių apdorojimo scenarijus bei jų apdorojimo būdus.

Scenarijus: žinutės apgodojimo metu servisas nulūžo.

Sprendimas: nieko nereikia daryti, Windows Azure Queue neišima žinutės iš eilės, o tiesiog pažymi kaip nematomą nurodytam laikui, po jo – žinutė vėl bus matoma kitiems apdorojimo servisams.

Scenarijus: tam tikra žinutė visada nulaužia apdorojimo servisą (kenkėjiška žinutė).

Sprendimas: bandyti apdoroti žinutes tik nurodytą skaičių kartų, po to – ignoruoti.

Scenarijus: žinutės apdorojimas viename iš servisų užtrūko ilgiau negu „nematomumo periodas“ (t.y. žinutė buvo jau grąžinta atgal į eilę).

Sprendimas: normaliai užbaigti žinutės apdorojimą, bandant šalinti žinutę iš eilės apdoroti situaciją, kaip žinutė jau yra ištrinta (kitas servisas apdorojo greičiau ir jau ją pašalino).

Žinučių apdorojimo šablonas

Žemiau pateikiamas žinučių apdorojimo šablonas, kuris atsižvelgia į visus aukščiau išvardintus scenarijus:

while (true)
{
    PingTask task = null;
    var success = false;

    try
    {
        // get message from the queue
        task = pingTaskRepository.GetTask();

        if (task != null)
        {
            // process task if any

            success = true;
        }
        else
        {
            // queue is empty - just sleep for some time
            Thread.Sleep(SleepInterval);
        }
    }
    catch (Exception)
    {
        // log
        success = false;
    }
    finally
    {
        // check for success or ensure it's not the poison message
        if (success || task != null && task.DequeueCount > DequeueThreadhold)
        {
            try
            {
                // delete message from the queue
                pingTaskRepository.DeleteTask(task);
            }
            catch (StorageClientException ex)
            {
                // the message has already been deleted
                if (ex.ExtendedErrorInformation.ErrorCode == "MessageNotFound")
                {
                    // log to tune the visibility timeout
                }
                else
                {
                    // log
                }
            }
        }
    }
}

Kitoje dalyje…

Šioje dalyje mes išnagrinėjome kaip korektiškai apdoroti Windows Azure Queue žinutes, kitoje dalyje pereisime prie Worker rolių įgyvendinimo. Pradėsime nuo Pinger, kuri ir panaudos aukščiau pateiktą šabloną.

Rodyk draugams

Skaidrės iš mano pristatymo Architecting Cloud-based Applications for Windows Azure Platform

Parašė Sergejus | 2010-10-30 15:41

Microsoft partnerių konferencijos metu dariau pristatymą iš programų, skirtų Windows Azure platformai, projektavimo.

Rodyk draugams