Osvědčené postupy pro vývoj pro web (vytváření Real-World cloudových aplikací v Azure)

Rick Anderson, Tom Dykstra

Stáhnout projekt Fix It nebo Stáhnout elektronickou knihu

Elektronická kniha Building Real World Cloud Apps with Azure je založená na prezentaci vyvinuté Scottem Guthriem. Vysvětluje 13 vzorů a postupů, které vám můžou pomoct s úspěšným vývojem webových aplikací pro cloud. Informace o elektronické knize najdete v první kapitole.

První tři vzory se týkají nastavení agilního procesu vývoje; Zbytek se týká architektury a kódu. Toto je kolekce osvědčených postupů pro vývoj webu:

Tyto postupy jsou platné pro veškerý vývoj webů, nejen pro cloudové aplikace, ale jsou obzvláště důležité pro cloudové aplikace. Spolupracují, aby vám pomohly optimálně využít vysoce flexibilní škálování nabízené cloudovým prostředím. Pokud tyto postupy nedodržujete, při pokusu o škálování aplikace narazíte na omezení.

Bezstavová webová vrstva za inteligentním nástrojem pro vyrovnávání zatížení

Bezstavová webová vrstva znamená, že neukládáte žádná data aplikací v paměti nebo systému souborů webového serveru. Zachování bezstavové webové vrstvy vám umožní poskytovat lepší prostředí pro zákazníky a šetřit peníze:

  • Pokud je webová vrstva bezstavová a nachází se za nástrojem pro vyrovnávání zatížení, můžete rychle reagovat na změny v provozu aplikací dynamickým přidáváním nebo odebíráním serverů. V cloudovém prostředí, kde platíte jenom za prostředky serveru tak dlouho, dokud je skutečně používáte, se tato schopnost reagovat na změny v poptávce může projevit obrovské úspory.
  • Bezstavová webová vrstva je z architektonického objemu aplikace mnohem jednodušší. I to vám umožní rychleji reagovat na potřeby škálování a utratit méně peněz za vývoj a testování v rámci procesu.
  • Cloudové servery, jako jsou místní servery, je potřeba občas opravovat a restartovat. a pokud je webová vrstva bezstavová, přesměrování provozu při dočasném výpadku serveru nezpůsobí chyby ani neočekávané chování.

Většina reálných aplikací potřebuje ukládat stav webové relace. hlavním bodem není ukládání na webový server. Stav můžete ukládat jinými způsoby, například v klientovi do souborů cookie nebo mimo proces na straně serveru v ASP.NET stavu relace pomocí poskytovatele mezipaměti. Soubory můžete ukládat do služby Windows Azure Blob Storage místo do místního systému souborů.

Příklad toho, jak snadné je škálování aplikace na webech Windows Azure, pokud je vaše webová úroveň bezstavová, najdete na kartě Škálování webu Windows Azure na portálu pro správu:

Karta Škálování

Pokud chcete přidat webové servery, stačí přetáhnout posuvník počtu instancí doprava. Nastavte ho na 5 a klikněte na Uložit. Během několika sekund budete mít ve Windows Azure 5 webových serverů, které zpracovávají provoz webu.

Pět instancí

Stejně snadno můžete nastavit odpočítání instancí na 3 nebo zpět na 1. Při horizontálním navýšení kapacity začnete okamžitě šetřit peníze, protože Windows Azure účtuje poplatky po minutách, ne po hodinách.

Windows Azure můžete také nastavit, aby automaticky zvýšil nebo snížil počet webových serverů na základě využití procesoru. Když v následujícím příkladu využití procesoru klesne pod 60 %, počet webových serverů se sníží na minimálně 2, a pokud využití procesoru překročí 80 %, zvýší se počet webových serverů až na 4.

Škálování podle využití procesoru

Nebo co když víte, že váš web bude zaneprázdněný jenom během pracovní doby? Windows Azure můžete nastavit, aby během dne běželo více serverů a snížila se na jeden server večer, noci a víkendy. Následující série snímků obrazovky ukazuje, jak nastavit web tak, aby běžel jeden server mimo pracovní dobu a 4 servery během pracovní doby od 8:00 do 17:00.

Škálování podle plánu

Nastavení časů plánu

Denní rozvrh

Rozvrh v noci

Víkendový plán

A to vše se samozřejmě dá provádět ve skriptech i na portálu.

Schopnost vaší aplikace škálovat kapacitu je ve Windows Azure téměř neomezená, pokud se vyhnete překážkám dynamického přidávání nebo odebírání serverových virtuálních počítačů tím, že zachováte bezstavovou webovou vrstvu.

Vyhněte se stavu relace

V reálné cloudové aplikaci často není praktické vyhnout se ukládání určité formy stavu pro relaci uživatele, ale některé přístupy mají vliv na výkon a škálovatelnost více než jiné. Pokud potřebujete uložit stav, nejlepším řešením je zachovat malé množství stavu a uložit ho do souborů cookie. Pokud to není možné, je dalším nejlepším řešením použít ASP.NET stavu relace u poskytovatele pro distribuovanou mezipaměť v paměti. Nejhorším řešením z hlediska výkonu a škálovatelnosti je použití poskytovatele stavu relace s podporou databáze.

Použití CDN k ukládání statických prostředků do mezipaměti

CDN je zkratka pro Content Delivery Network. Zprostředkovateli CDN poskytnete prostředky statických souborů, jako jsou obrázky a soubory skriptů, a poskytovatel tyto soubory ukládá do mezipaměti v datových centrech po celém světě, takže bez ohledu na to, kde uživatelé přistupují k vaší aplikaci, získají relativně rychlou odezvu a nízkou latenci u prostředků uložených v mezipaměti. Tím se zrychlí celková doba načítání webu a sníží se zatížení webových serverů. Sítě CDN jsou zvlášť důležité, pokud oslovujete cílovou skupinu, která je geograficky široce distribuovaná.

Windows Azure má síť CDN a další sítě CDN můžete používat v aplikaci, která běží ve Windows Azure nebo v jakémkoli prostředí hostování webů.

Použití asynchronní podpory rozhraní .NET 4.5 k zabránění blokování volání

.NET 4.5 vylepšil programovací jazyky C# a VB, aby bylo mnohem jednodušší zpracovávat úlohy asynchronně. Výhodou asynchronního programování není jen paralelní zpracování, například když chcete spustit více volání webové služby současně. Umožňuje také, aby webový server fungoval efektivněji a spolehlivěji za podmínek vysokého zatížení. Webový server má k dispozici pouze omezený počet vláken a za podmínek vysokého zatížení, když se používají všechna vlákna, musí příchozí požadavky počkat, až se vlákna uvolní. Pokud kód aplikace nezpracuje úlohy, jako jsou databázové dotazy nebo volání webových služeb asynchronně, mnoho vláken je zbytečně svázaných, zatímco server čeká na vstupně-výstupní odpověď. Tím se omezí objem provozu, který server dokáže zpracovat za podmínek vysokého zatížení. Při asynchronním programování se vlákna, která čekají na vrácení dat webovou službou nebo databází, uvolní až do doby, než budou přijata data. Na zaneprázdněném webovém serveru je pak možné rychle zpracovat stovky nebo tisíce požadavků, které by jinak čekaly na uvolnění vláken.

Jak jste viděli dříve, je stejně snadné snížit počet webových serverů, které váš web zpracovávají, stejně jako jejich zvýšení. Pokud tedy server dokáže dosáhnout větší propustnosti, nepotřebujete jich tolik a můžete snížit náklady, protože potřebujete pro daný objem provozu méně serverů, než byste jinak.

Podpora asynchronního programovacího modelu .NET 4.5 je součástí ASP.NET 4.5 pro Web Forms, MVC a webové rozhraní API, v Entity Frameworku 6 a v rozhraní API služby Windows Azure Storage.

Podpora asynchronních připojení v ASP.NET 4.5

V ASP.NET 4.5 byla podpora asynchronního programování přidána nejen do jazyka, ale také do architektur MVC, Web Forms a webových rozhraní API. Například metoda akce kontroleru ASP.NET MVC přijme data z webového požadavku a předá data do zobrazení, které pak vytvoří kód HTML, který se odešle do prohlížeče. Metoda akce často potřebuje získat data z databáze nebo webové služby, aby je mohla zobrazit na webové stránce nebo uložit data zadaná na webové stránce. V těchto scénářích je snadné udělat metodu action asynchronní: místo vrácení objektu ActionResult vrátíte Task<ActionResult> a označíte metodu klíčovým slovem async . Když v metodě spustí řádek kódu operaci, která zahrnuje čekací dobu, označíte ji klíčovým slovem await.

Tady je jednoduchá metoda akce, která volá metodu úložiště pro databázový dotaz:

public ActionResult Index()
{
    string currentUser = User.Identity.Name;
    var result = fixItRepository.FindOpenTasksByOwner(currentUser);

    return View(result);
}

A tady je stejná metoda, která zpracovává volání databáze asynchronně:

public async Task<ActionResult> Index()
{
    string currentUser = User.Identity.Name;
    var result = await fixItRepository.FindOpenTasksByOwnerAsync(currentUser);

    return View(result);
}

Pod kryty kompilátor vygeneruje odpovídající asynchronní kód. Když aplikace provede volání FindTaskByIdAsyncaplikace , ASP.NET vytvoří FindTask požadavek a pak uvolní pracovní vlákno a zpřístupní ho ke zpracování dalšího požadavku. Po dokončení FindTask požadavku se vlákno restartuje, aby se pokračovalo ve zpracování kódu, který následuje po volání. Během přechodného období mezi zahájením FindTask požadavku a vrácením dat máte k dispozici vlákno, které může provádět užitečnou práci, která by jinak byla svázaná čekáním na odpověď.

Asynchronní kód má určitou režii, ale v podmínkách s nízkým zatížením je tato režie zanedbatelná, zatímco za podmínek s vysokým zatížením můžete zpracovávat požadavky, které by jinak čekaly na dostupná vlákna.

Tento typ asynchronního programování bylo možné provádět od ASP.NET 1.1, ale bylo obtížné psát, náchylné k chybám a bylo obtížné ho ladit. Teď, když jsme pro ni zjednodušili kódování v ASP.NET 4.5, není žádný důvod, proč by to už neměli dělat.

Podpora asynchronních připojení v Entity Frameworku 6

V rámci asynchronní podpory ve 4.5 jsme dodali asynchronní podporu volání webových služeb, soketů a vstupně-výstupních operací systému souborů, ale nejběžnějším vzorem pro webové aplikace je přístup k databázi a naše knihovny dat nepodporují asynchronní připojení. Entity Framework 6 teď přidává asynchronní podporu pro přístup k databázi.

V Entity Frameworku 6 mají všechny metody, které způsobují odeslání dotazu nebo příkazu do databáze, asynchronní verze. Příklad zde ukazuje asynchronní verzi metody Find .

public async Task<FixItTask> FindTaskByIdAsync(int id)
{
    FixItTask fixItTask = null;
    Stopwatch timespan = Stopwatch.StartNew();

    try
    {
        fixItTask = await db.FixItTasks.FindAsync(id);
        
        timespan.Stop();
        log.TraceApi("SQL Database", "FixItTaskRepository.FindTaskByIdAsync", timespan.Elapsed, "id={0}", id);
    }
    catch(Exception e)
    {
        log.Error(e, "Error in FixItTaskRepository.FindTaskByIdAsynx(id={0})", id);
    }

    return fixItTask;
}

A tato asynchronní podpora funguje nejen pro vkládání, odstraňování, aktualizace a jednoduchá hledání, ale také s dotazy LINQ:

public async Task<List<FixItTask>> FindOpenTasksByOwnerAsync(string userName)
{
    Stopwatch timespan = Stopwatch.StartNew();

    try
    {
        var result = await db.FixItTasks
            .Where(t => t.Owner == userName)
            .Where(t=>t.IsDone == false)
            .OrderByDescending(t => t.FixItTaskId).ToListAsync();

        timespan.Stop();
        log.TraceApi("SQL Database", "FixItTaskRepository.FindTasksByOwnerAsync", timespan.Elapsed, "username={0}", userName);

        return result;
    }
    catch (Exception e)
    {
        log.Error(e, "Error in FixItTaskRepository.FindTasksByOwnerAsync(userName={0})", userName);
        return null;
    }
}

Async Existuje verze ToList metody, protože v tomto kódu je to metoda, která způsobí odeslání dotazu do databáze. Metody Where a OrderByDescending konfigurují pouze dotaz, zatímco ToListAsync metoda dotaz spustí a uloží odpověď do result proměnné.

Souhrn

Osvědčené postupy pro vývoj webů uvedené tady můžete implementovat v libovolné architektuře webového programování a v libovolném cloudovém prostředí, ale máme nástroje v ASP.NET a Windows Azure, které vám to usnadní. Pokud budete postupovat podle těchto vzorů, můžete snadno škálovat kapacitu webové vrstvy a minimalizovat náklady, protože každý server bude schopen zpracovat větší provoz.

Další kapitola se zabývá tím, jak cloud umožňuje scénáře jednotného přihlašování.

Zdroje informací

Další informace najdete v následujících zdrojích informací.

Bezstavové webové servery:

CDN:

Asynchronní programování:

Další osvědčené postupy pro vývoj webů najdete v následujících zdrojích informací: