Web geliştirme En Iyi uygulamaları (Azure ile Real-World bulut uygulamaları oluşturma)Web Development Best Practices (Building Real-World Cloud Apps with Azure)

, Mike te son, Rick Anderson, Tom Dykstra tarafındanby Mike Wasson, Rick Anderson, Tom Dykstra

Onarma projesini indirin veya E-kitabı indirinDownload Fix It Project or Download E-book

Azure e-book Ile gerçek dünyada bulut uygulamaları oluşturma , Scott Guthrie tarafından geliştirilen bir sunuyu temel alır.The Building Real World Cloud Apps with Azure e-book is based on a presentation developed by Scott Guthrie. Bulut için Web Apps 'i başarılı bir şekilde geliştirmeye yardımcı olabilecek 13 desen ve uygulamaları açıklar.It explains 13 patterns and practices that can help you be successful developing web apps for the cloud. E-kitap hakkında daha fazla bilgi için ilk bölümebakın.For information about the e-book, see the first chapter.

İlk üç desen çevik bir geliştirme süreci ayarlamakmıştı. geri kalan mimari ve kodlardır.The first three patterns were about setting up an agile development process; the rest are about architecture and code. Bu, bir Web geliştirme en iyi uygulamaları koleksiyonudur:This one is a collection of web development best practices:

Bu uygulamalar yalnızca bulut uygulamaları için değil tüm Web geliştirme işlemleri için geçerlidir, ancak özellikle de bulut uygulamaları için önemlidir.These practices are valid for all web development, not just for cloud apps, but they're especially important for cloud apps. Bulut ortamı tarafından sunulan son derece esnek ölçeklendirmeyi en iyi şekilde kullanmanıza yardımcı olmak üzere birlikte çalışır.They work together to help you make optimal use of the highly flexible scaling offered by the cloud environment. Bu uygulamaları izlemeden, uygulamanızı ölçeklendirmeye çalıştığınızda sınırlamalar ile karşılaşırsınız.If you don't follow these practices, you'll run into limitations when you try to scale your application.

Akıllı yük dengeleyicinin arkasında durum bilgisiz Web katmanıStateless web tier behind a smart load balancer

Durum bilgisiz Web katmanı , herhangi bir uygulama verisini Web sunucusu belleğinde veya dosya sisteminde depolamazsanız anlamına gelir.Stateless web tier means you don't store any application data in the web server memory or file system. Web katmanınızın durum bilgisiz olması, daha iyi bir müşteri deneyimi sağlamanıza ve paradan tasarruf etmenize olanak sağlar:Keeping your web tier stateless enables you to both provide a better customer experience and save money:

  • Web katmanı durumsuz ve bir yük dengeleyicinin arkasında yer alıyorsa, sunucuları dinamik olarak ekleyerek veya kaldırarak uygulama trafiğinden değişikliklere hızlıca yanıt verebilirsiniz.If the web tier is stateless and it sits behind a load balancer, you can quickly respond to changes in application traffic by dynamically adding or removing servers. Yalnızca kullandığınız sürece sunucu kaynakları için ödeme yaptığınız bulut ortamında, isteğe bağlı değişikliklere yanıt verme özelliği büyük tasarrufa çevrilebilir.In the cloud environment where you only pay for server resources for as long as you actually use them, that ability to respond to changes in demand can translate into huge savings.
  • Durum bilgisiz Web katmanı, uygulamanın ölçeğini genişletmek için mimari olarak çok daha basittir.A stateless web tier is architecturally much simpler to scale out the application. Bu, ölçekleme ihtiyaçlarına daha hızlı yanıt vermenize ve süreçte geliştirme ve test konusunda daha az para harcamanıza olanak sağlar.That too enables you to respond to scaling needs more quickly, and spend less money on development and testing in the process.
  • Şirket içi sunucular gibi bulut sunucularının, her zaman düzeltme ve yeniden başlatılması gerekir; Web katmanı durum bilgisiz ise, bir sunucu geçici olarak kaldığında trafiği yeniden yönlendirme işlemi hatalara veya beklenmeyen davranışlara neden olmaz.Cloud servers, like on-premises servers, need to be patched and rebooted occasionally; and if the web tier is stateless, re-routing traffic when a server goes down temporarily won't cause errors or unexpected behavior.

En gerçek dünya uygulamalarının, bir Web oturumu için durumu depolaması gerekir; Buradaki ana nokta onu Web sunucusunda depolamadır.Most real-world applications do need to store state for a web session; the main point here is not to store it on the web server. Bir önbellek sağlayıcısı kullanarak, durumu tanımlama bilgilerinde istemci veya işlem sunucusu tarafında ASP.NET oturum durumu gibi başka yollarla da saklayabilirsiniz.You can store state in other ways, such as on the client in cookies or out of process server-side in ASP.NET session state using a cache provider. Dosyaları yerel dosya sistemi yerine Windows Azure Blob Storage 'da saklayabilirsiniz.You can store files in Windows Azure Blob storage instead of the local file system.

Web katmanınız durum bilgisiz ise, Windows Azure Web siteleri 'nde bir uygulamayı ölçeklendirmenin ne kadar kolay olduğunu gösteren bir örnek olarak, yönetim portalındaki bir Windows Azure Web sitesinin Ölçek sekmesine bakın:As an example of how easy it is to scale an application in Windows Azure Web Sites if your web tier is stateless, see the Scale tab for a Windows Azure Web Site in the management portal:

Ölçek sekmesi

Web sunucuları eklemek istiyorsanız örnek sayısı kaydırıcısını sağa sürüklemeniz yeterlidir.If you want to add web servers, you can just drag the instance count slider to the right. 5 olarak ayarlayın ve Kaydet' e tıklayın ve saniyeler Içinde, Microsoft Azure 'da Web sitenizin trafiğinizi işleyen 5 Web sunucusu vardır.Set it to 5 and click Save, and within seconds you have 5 web servers in Windows Azure handling your web site's traffic.

Beş örnek

Örnek sayısını kolayca 3 ' e veya 1 ' e geri döndürebilmeniz yeterlidir.You can just as easily set the instance count down to 3 or back down to 1. Ölçeği geri döndüğünüzde, Microsoft Azure 'un saate göre değil, dakikaya göre ücretlendirilmesi anında tasarruf etmeye başlar.When you scale back, you start saving money immediately because Windows Azure charges by the minute, not by the hour.

Ayrıca, Windows Azure 'un CPU kullanımına göre Web sunucularının sayısını otomatik olarak artırmasını veya azaltmasını söyleyebilirsiniz.You can also tell Windows Azure to automatically increase or decrease the number of web servers based on CPU usage. Aşağıdaki örnekte, CPU kullanımı %60 altına gittiğinde, Web sunucularının sayısı en az 2 ' ye düşürülecektir ve CPU kullanımı %80 ' nin üzerinde olursa, Web sunucularının sayısı en fazla 4 ' e yükseltilir.In the following example, when CPU usage goes below 60%, the number of web servers will decrease to a minimum of 2, and if CPU usage goes above 80%, the number of web servers will be increased up to a maximum of 4.

CPU kullanımına göre ölçeklendir

Ya da sitenizin yalnızca çalışma saatlerinde meşgul olacağını biliyorsanız ne olur?Or what if you know that your site will only be busy during working hours? Windows Azure 'a, gündüz saati sırasında birden çok sunucu çalıştırmasını ve tek bir sunucu evente, Nights ve hafta sonlarını azaltmasını söyleyebilirsiniz.You can tell Windows Azure to run multiple servers during the daytime and decrease to a single server evenings, nights, and weekends. Aşağıdaki ekran görüntüleri serisi, Web sitesinin, çalışma saatleri boyunca saat ve 4 sunucu çalıştırmak üzere, 8 ile 5 PM arasında bir sunucuyu nasıl ayarlayacağınızı gösterir.The following series of screen shots shows how to set up the web site to run one server in off hours and 4 servers during work hours from 8 AM to 5 PM.

Zamanlamaya göre ölçeklendir

Zamanlama sürelerini ayarlama

Gündüz zamanlaması

Weekgece zamanlaması

Hafta sonu zamanlaması

Ayrıca, bu tüm elbette, portalda ve portalda de yapılabilir.And of course all of this can be done in scripts as well as in the portal.

Uygulamanızın ölçeklendirme özelliği, Microsoft Azure 'da neredeyse sınırsız olduğundan, Web katmanını durum bilgisiz halinde tutarak sunucu VM 'lerini dinamik olarak eklemek veya kaldırmak için gereken engelleri ortadan kaldırırsınız.The ability of your application to scale out is almost unlimited in Windows Azure, so long as you avoid impediments to dynamically adding or removing server VMs, by keeping the web tier stateless.

Oturum durumunu önleyinAvoid session state

Bir Kullanıcı oturumu için bir durum biçiminin depolanmasını önlemek için genellikle gerçek dünyada bir bulut uygulamasında pratik değildir ancak bazı yaklaşımlar performansı ve ölçeklenebilirliği diğerlerinden daha fazla etkiler.It's often not practical in a real-world cloud app to avoid storing some form of state for a user session, but some approaches impact performance and scalability more than others. Durumu depolamanız gerekirse, en iyi çözüm durum miktarını küçük tutmak ve tanımlama bilgilerinde depolamak olur.If you have to store state, the best solution is to keep the amount of state small and store it in cookies. Bu uygun değilse, bir sonraki en iyi çözüm Dağıtılmış, bellek içi önbellekiçin bir sağlayıcıyla ASP.NET oturum durumunu kullanmaktır.If that isn't feasible, the next best solution is to use ASP.NET session state with a provider for distributed, in-memory cache. Performans ve ölçeklenebilirlik açısından en kötü çözüm, veritabanı tarafından desteklenen bir oturum durumu sağlayıcısı kullanmaktır.The worst solution from a performance and scalability standpoint is to use a database backed session state provider.

Statik dosya varlıklarını önbelleğe almak için CDN kullanmaUse a CDN to cache static file assets

CDN, Content Delivery Network için bir kısaltdır.CDN is an acronym for Content Delivery Network. Bir CDN sağlayıcısına görüntü ve betik dosyaları gibi statik dosya varlıkları sağlarsınız ve sağlayıcı bu dosyaları tüm dünyada veri merkezlerinde önbelleğe alarak, kullanıcıların uygulamanıza her erişmesi halinde, önbelleğe alınan varlıklar için görece hızlı yanıt ve düşük gecikme süresi alırlar.You provide static file assets such as images and script files to a CDN provider, and the provider caches these files in data centers all over the world so that wherever people access your application, they get relatively quick response and low latency for the cached assets. Bu, sitenin genel yükleme süresini hızlandırır ve web sunucularınızda yükü azaltır.This speeds up the overall load time of the site and reduces the load on your web servers. Coğrafi olarak geniş bir şekilde dağıtılan bir hedef kitleye ulaşmanız durumunda CDNs özellikle önemlidir.CDNs are especially important if you are reaching an audience that is widely distributed geographically.

Windows Azure 'da bir CDN vardır ve Windows Azure 'da veya herhangi bir Web barındırma ortamında çalışan bir uygulamada diğer CDNs kullanabilirsiniz.Windows Azure has a CDN, and you can use other CDNs in an application that runs in Windows Azure or any web hosting environment.

Çağrı engellemeyi önlemek için .NET 4.5 'in zaman uyumsuz desteğini kullanınUse .NET 4.5's async support to avoid blocking calls

.NET 4,5, görevlerin zaman uyumsuz olarak işlemesini çok daha basit hale getirmek için C# ve VB programlama dillerini geliştirmiştir..NET 4.5 enhanced the C# and VB programming languages in order to make it much simpler to handle tasks asynchronously. Zaman uyumsuz programlama avantajı, aynı anda birden çok Web hizmeti çağrısı yapmak istediğinizde gibi paralel işleme durumları için değildir.The benefit of asynchronous programming is not just for parallel processing situations such as when you want to kick off multiple web service calls simultaneously. Ayrıca, Web sunucunuzun yüksek yük koşullarında daha verimli ve güvenilir bir şekilde çalışmasını sağlar.It also enables your web server to perform more efficiently and reliable under high load conditions. Bir Web sunucusu yalnızca kullanılabilir sayıda iş parçacığına sahiptir ve yüksek yük koşulları altında, tüm iş parçacıkları kullanımda olduğunda, gelen isteklerin iş parçacıkları serbest olana kadar beklemesi gerekir.A web server only has a limited number of threads available, and under high load conditions when all of the threads are in use, incoming requests have to wait until threads are freed up. Uygulama kodunuz veritabanı sorguları ve Web hizmeti çağrısı gibi görevleri zaman uyumsuz olarak işlemezse, sunucu bir g/ç yanıtı beklerken birçok iş parçacığı gereksiz yere bağlı olur.If your application code doesn't handle tasks like database queries and web service calls asynchronously, many threads are unnecessarily tied up while the server is waiting for an I/O response. Bu, sunucunun yüksek yük koşulları altında işleyebileceği trafik miktarını sınırlandırır.This limits the amount of traffic the server can handle under high load conditions. Zaman uyumsuz programlama ile, bir Web hizmetini veya veritabanını döndürmek için bekleyen iş parçacıkları, veri alınana kadar yeni isteklere hizmet vermek için serbest bırakılır.With asynchronous programming, threads that are waiting for a web service or database to return data are freed up to service new requests until the data the is received. Meşgul bir Web sunucusunda, yüzlerce veya binlerce istek daha sonra işlem için iş parçacıklarının serbest bırakılabileceği şekilde beklenmez.In a busy web server, hundreds or thousands of requests can then be processed promptly which would otherwise be waiting for threads to be freed up.

Daha önce gördüğünüz gibi, Web sitenizi artıracak Web sunucusu sayısını azaltmak oldukça kolay bir işlemdir.As you saw earlier, it's as easy to decrease the number of web servers handling your web site as it is to increase them. Bu nedenle, bir sunucu daha fazla işleme sağlayabiliyorsa, bu kadar birçok işlem yapmanız gerekmez ve belirli bir trafik hacmi için daha az sunucuya ihtiyacınız olduğundan maliyetlerinizi azaltabilirsiniz.So if a server can achieve greater throughput, you don't need as many of them and you can decrease your costs because you need fewer servers for a given traffic volume than you otherwise would.

.NET 4,5 zaman uyumsuz programlama modeli desteği Web Forms, MVC ve Web API 'SI için ASP.NET 4,5 ' ye dahildir; Entity Framework 6 ' da ve Windows Azure Storage API' de.Support for the .NET 4.5 asynchronous programming model is included in ASP.NET 4.5 for Web Forms, MVC, and Web API; in Entity Framework 6, and in the Windows Azure Storage API.

ASP.NET 4,5 ' de zaman uyumsuz destekAsync support in ASP.NET 4.5

ASP.NET 4,5 ' de, zaman uyumsuz programlama desteği yalnızca dile değil, MVC, Web Forms ve Web API çerçevelerine de eklenmiştir.In ASP.NET 4.5, support for asynchronous programming has been added not just to the language but also to the MVC, Web Forms, and Web API frameworks. Örneğin, bir ASP.NET MVC denetleyici eylemi yöntemi bir Web isteğinden verileri alır ve verileri tarayıcıya gönderilmek üzere HTML oluşturan bir görünüme geçirir.For example, an ASP.NET MVC controller action method receives data from a web request and passes the data to a view which then creates the HTML to be sent to the browser. Genellikle eylem yönteminin bir Web sayfasında gösterilmesi veya bir Web sayfasına girilen verileri kaydetmesi için bir veritabanından veya Web hizmetinden veri alması gerekir.Frequently the action method needs to get data from a database or web service in order to display it in a web page or to save data entered in a web page. Bu senaryolarda, eylem yöntemini zaman uyumsuz yapmak kolaydır: bir ActionResult nesnesi döndürmek yerine, görev < > ActionResult öğesini döndürür ve yöntemi Async anahtar sözcüğüyle işaretler.In those scenarios it's easy to make the action method asynchronous: instead of returning an ActionResult object, you return Task<ActionResult> and mark the method with the async keyword. Yöntemi içinde, bir kod satırı bekleme süresi içeren bir işlemden sonra, await anahtar sözcüğüyle işaretlersiniz.Inside the method, when a line of code kicks off an operation that involves wait time, you mark it with the await keyword.

Veritabanı sorgusu için bir depo yöntemi çağıran basit bir eylem yöntemi aşağıda verilmiştir:Here is a simple action method that calls a repository method for a database query:

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

    return View(result);
}

İşte veritabanı çağrısını zaman uyumsuz olarak işleyen yöntemin aynısı:And here is the same method that handles the database call asynchronously:

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

    return View(result);
}

' In altında, derleyici uygun zaman uyumsuz kodu oluşturur.Under the covers the compiler generates the appropriate asynchronous code. Uygulama çağrısını yaptığında FindTaskByIdAsync , ASP.net, FindTask isteği yapar ve ardından çalışan iş parçacığını geri alabilir ve başka bir isteği işlemek için kullanılabilir hale getirir.When the application makes the call to FindTaskByIdAsync, ASP.NET makes the FindTask request and then unwinds the worker thread and makes it available to process another request. İstek tamamlandığında FindTask , bu çağrıdan sonra gelen kodun işlenmesine devam etmek için bir iş parçacığı yeniden başlatılır.When the FindTask request is done, a thread is restarted to continue processing the code that comes after that call. FindTaskİsteğin başlatıldığı ve verilerin döndürüldüğü zaman arasında aradaki bir iş parçacığına sahip olursunuz, aksi takdirde, yanıt beklenmek üzere bağlı olacak yararlı bir iş parçacığı vardır.During the interim between when the FindTask request is initiated and when the data is returned, you have a thread available to do useful work which otherwise would be tied up waiting for the response.

Zaman uyumsuz kod için bazı ek yük vardır, ancak düşük yük koşullarında bu ek yük göz ardı edilebilir, ancak yüksek yük koşullarında, diğer durumlarda kullanılabilir iş parçacıkları için bekleyen istekleri işleyebileceksiniz.There is some overhead for asynchronous code, but under low-load conditions, that overhead is negligible, while under high-load conditions you're able to process requests that otherwise would be held up waiting for available threads.

Bu tür zaman uyumsuz programlamayı ASP.NET 1,1 tarihinden itibaren yapmak mümkün, ancak yazmak, hataya açık ve hata ayıklama zor bir sorun oluştu.It has been possible to do this kind of asynchronous programming since ASP.NET 1.1, but it was difficult to write, error-prone, and difficult to debug. Bu nedenle, ASP.NET 4,5 ' de kodlama basitleştirildiğimiz için artık bu değil.Now that we've simplified the coding for it in ASP.NET 4.5, there's no reason not to do it anymore.

Entity Framework 6 ' da zaman uyumsuz destekAsync support in Entity Framework 6

4,5 ' de zaman uyumsuz desteğin bir parçası olarak Web hizmeti çağrıları, yuvalar ve dosya sistemi g/ç için zaman uyumsuz destek sunduk, ancak Web uygulamaları için en yaygın model bir veritabanına ulaşmalıdır ve veri kitaplıklarımız zaman uyumsuz olarak desteklenmez.As part of async support in 4.5 we shipped async support for web service calls, sockets, and file system I/O, but the most common pattern for web applications is to hit a database, and our data libraries didn't support async. Artık Entity Framework 6, veritabanı erişimi için zaman uyumsuz destek ekler.Now Entity Framework 6 adds async support for database access.

Entity Framework 6 ' da, bir sorgunun veya komutun veritabanına gönderilmesine neden olan tüm yöntemler zaman uyumsuz sürümlere sahiptir.In Entity Framework 6 all methods that cause a query or command to be sent to the database have async versions. Buradaki örnekte Find yönteminin Async sürümü gösterilmektedir.The example here shows the async version of the Find method.

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;
}

Bu zaman uyumsuz destek yalnızca ekleme, silme, güncelleştirme ve basit bulma için değil, LINQ sorguları ile de kullanılabilir:And this async support works not just for inserts, deletes, updates, and simple finds, it also works with LINQ queries:

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 ToList Bu kodda, bir sorgunun veritabanına gönderilmesine neden olan yöntemi olan bir yönteminin sürümü bulunmaktadır.There's an Async version of the ToList method because in this code that's the method that causes a query to be sent to the database. WhereVe OrderByDescending yöntemleri yalnızca sorguyu yapılandırır, ToListAsync Yöntem sorguyu yürütür ve yanıtı result değişkende depolar.The Where and OrderByDescending methods only configure the query, while the ToListAsync method executes the query and stores the response in the result variable.

ÖzetSummary

Burada özetlenen Web geliştirme en iyi uygulamalarını herhangi bir Web programlama çerçevesinde ve herhangi bir bulut ortamında uygulayabilirsiniz, ancak ASP.NET ve Windows Azure 'da araçlara kolayca ulaşabilirsiniz.You can implement the web development best practices outlined here in any web programming framework and any cloud environment, but we have tools in ASP.NET and Windows Azure to make it easy. Bu desenleri izlerseniz, Web katmanınızı kolayca ölçeklendirebilirsiniz ve her sunucu daha fazla trafik işleyebildiğinden, harcamalarınızı en aza indirirsiniz.If you follow these patterns, you can easily scale out your web tier, and you'll minimize your expenses because each server will be able to handle more traffic.

Sonraki bölümde , bulutun çoklu oturum açma senaryolarına nasıl izin vertığı gösterilmektedir.The next chapter looks at how the cloud enables single sign-on scenarios.

KaynaklarResources

Daha fazla bilgi için aşağıdaki kaynaklara bakın.For more information see the following resources.

Durum bilgisiz Web sunucuları:Stateless web servers:

'YeCDN:

Zaman uyumsuz programlama:Asynchronous programming:

Daha fazla Web geliştirme için en iyi uygulamalar için aşağıdaki kaynaklara bakın:For additional web development best practices, see the following resources: