Web Geliştirme en iyi yöntemleri (Azure ile Real-World Cloud Apps Oluşturma)

Tarafından Rick Anderson, Tom Dykstra

Fix It Project'i indirin veya E-kitap indirin

Azure ile Gerçek Dünya Bulut Uygulamaları Oluşturma e-kitabı, Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için web uygulamalarını başarıyla geliştirmenize yardımcı olabilecek 13 desen ve uygulama açıklanmaktadır. E-kitap hakkında bilgi için ilk bölüme bakın.

İlk üç desen çevik bir geliştirme süreci ayarlamayla ilgiliydi; gerisi mimari ve kodla ilgili. Bu, web geliştirme en iyi deneyimlerinden oluşan bir koleksiyondur:

Bu uygulamalar yalnızca bulut uygulamaları için değil, özellikle bulut uygulamaları için de önemlidir. Bulut ortamı tarafından sunulan yüksek oranda esnek ölçeklendirmeyi en iyi şekilde kullanmanıza yardımcı olmak için birlikte çalışırlar. Bu uygulamaları izlemezseniz, uygulamanızı ölçeklendirmeye çalıştığınızda sınırlamalarla karşılaşırsınız.

Akıllı yük dengeleyicinin arkasında durum bilgisi olmayan web katmanı

Durum bilgisi olmayan web katmanı , web sunucusu belleğinde veya dosya sisteminde uygulama verilerini depolamadığınız anlamına gelir. Web katmanınızı durum bilgisiz tutmak hem daha iyi bir müşteri deneyimi sağlamanıza hem de tasarruf etmenizi sağlar:

  • Web katmanı durum bilgisi yoksa ve bir yük dengeleyicinin arkasındaysa, sunucuları dinamik olarak ekleyerek veya kaldırarak uygulama trafiğindeki değişikliklere hızlı bir şekilde yanıt vekleyebilirsiniz. Sunucu kaynaklarını gerçekten kullandığınız sürece yalnızca ödeme yaptığınız bulut ortamında, talepteki değişikliklere yanıt verme yeteneği büyük tasarruflara dönüşebilir.
  • Durum bilgisi olmayan bir web katmanı, mimari olarak uygulamanın ölçeğini genişletmek için çok daha basittir. Bu da ölçeklendirme gereksinimlerine daha hızlı yanıt vermenizi ve süreçte geliştirme ve test için daha az para harcamanızı sağlar.
  • Şirket içi sunucular gibi bulut sunucularının zaman zaman yamalanması ve yeniden başlatılması gerekir; ve web katmanı durum bilgisi yoksa, bir sunucu geçici olarak kapandığında trafiği yeniden yönlendirmek hatalara veya beklenmeyen davranışlara neden olmaz.

Çoğu gerçek dünya uygulamasının bir web oturumu için durum depolaması gerekir; Buradaki ana nokta, web sunucusunda depolamamaktır. Önbellek sağlayıcısı kullanarak durumu istemcide tanımlama bilgilerinde veya işlem dışı sunucu tarafında ASP.NET oturum durumunda depolayabilirsiniz. Dosyaları yerel dosya sistemi yerine Windows Azure Blob depolama alanında depolayabilirsiniz.

Web katmanınız durum bilgisi yoksa Windows Azure Web Siteleri'nde bir uygulamayı ölçeklendirmenin ne kadar kolay olduğunu gösteren bir örnek olarak, yönetim portalında Windows Azure Web Sitesi için Ölçeklendirme sekmesine bakın:

Ölçek sekmesi

Web sunucuları eklemek istiyorsanız örnek sayısı kaydırıcısını sağa sürükleyebilirsiniz. 5 olarak ayarlayın ve Kaydet'e tıklayın; saniyeler içinde Windows Azure'da web sitenizin trafiğini işleyen 5 web sunucunuz olur.

Beş örnek

Örnek sayısını 3'e veya geri 1'e kadar kolayca ayarlayabilirsiniz. Ölçeği yeniden daralttığınızda, Windows Azure saatte değil dakika başına ücretlendirildiğinden hemen tasarruf etmeye başlarsınız.

Ayrıca Windows Azure'a CPU kullanımına göre web sunucusu sayısını otomatik olarak artırmasını veya azaltmasını da söyleyebilirsiniz. Aşağıdaki örnekte, CPU kullanımı %60'ın altına düştüğünde web sunucusu sayısı en az 2'ye düşer ve CPU kullanımı %80'in üzerine çıkarsa web sunucusu sayısı en fazla 4'e çıkarılır.

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

Ya da sitenizin yalnızca çalışma saatlerinde meşgul olacağını biliyorsanız ne olur? Windows Azure'a gündüz birden çok sunucu çalıştırmasını ve tek sunucu akşam, gece ve hafta sonlarına kadar azalmasını söyleyebilirsiniz. Aşağıdaki ekran görüntüleri serisinde, web sitesinin çalışma saatleri dışında bir sunucuyu ve 08:00 ile 17:00 arasında 4 sunucuyu çalıştıracak şekilde nasıl ayarlanacağı gösterilmektedir.

Zamanlamaya göre ölçeklendirme

Zamanlama zamanlarını ayarlama

Gün saat zamanlaması

Hafta başı zamanlaması

Hafta sonu programı

Ve elbette tüm bunlar hem betiklerde hem de portalda yapılabilir.

Web katmanını durum bilgisiz tutarak sunucu VM'lerini dinamik olarak ekleme veya kaldırma engellerinden kaçındığınız sürece, uygulamanızın ölçeği genişletme özelliği Windows Azure'da neredeyse sınırsızdır.

Oturum durumundan kaçının

Bir kullanıcı oturumu için bir tür durum depolamaktan kaçınmak genellikle gerçek dünya bulut uygulamasında pratik değildir, ancak bazı yaklaşımlar performansı ve ölçeklenebilirliği diğerlerinden daha çok etkiler. Durumu depolamanız gerekiyorsa en iyi çözüm, durum miktarını küçük tutmak ve tanımlama bilgileri içinde depolamaktır. Bu uygun değilse, bir sonraki en iyi çözüm dağıtılmış , bellek içi önbellek için bir sağlayıcıyla ASP.NET oturum durumunu kullanmaktır. Performans ve ölçeklenebilirlik açısından en kötü çözüm, veritabanı destekli oturum durumu sağlayıcısı kullanmaktır.

Statik dosya varlıklarını önbelleğe almak için CDN kullanma

CDN, Content Delivery Network'in kısaltmasıdır. Görüntüler ve betik dosyaları gibi statik dosya varlıklarını bir CDN sağlayıcısına sağlarsınız ve sağlayıcı bu dosyaları dünyanın her yanındaki veri merkezlerinde önbelleğe alır, böylece insanlar uygulamanıza her eriştiğinde, önbelleğe alınan varlıklar için görece hızlı yanıt ve düşük gecikme süresi elde ederler. Bu, sitenin genel yükleme süresini hızlandırır ve web sunucularınızdaki yükü azaltır. CdN'ler, coğrafi olarak geniş bir kitleye ulaşıyorsanız özellikle önemlidir.

Windows Azure'da CDN vardır ve Windows Azure'da veya herhangi bir web barındırma ortamında çalışan bir uygulamada diğer CDN'leri kullanabilirsiniz.

Çağrıların engellenmesini önlemek için .NET 4.5'in zaman uyumsuz desteğini kullanın

.NET 4.5, görevleri zaman uyumsuz olarak işlemeyi çok daha basit hale getirmek için C# ve VB programlama dillerini geliştirdi. Zaman uyumsuz programlamanın avantajı, birden çok web hizmeti çağrısını aynı anda başlatma gibi paralel işleme durumlarına yönelik değildir. Ayrıca, web sunucunuzun yüksek yük koşullarında daha verimli ve güvenilir performans göstermesini sağlar. Bir web sunucusunda yalnızca sınırlı sayıda kullanılabilir iş parçacığı vardır ve tüm iş parçacıkları kullanımda olduğunda yüksek yük koşullarında, gelen isteklerin iş parçacıkları boşaltılana kadar beklemesi gerekir. Uygulama kodunuz veritabanı sorguları ve web hizmeti çağrıları gibi görevleri zaman uyumsuz olarak işlemiyorsa, sunucu G/Ç yanıtı beklerken birçok iş parçacığı gereksiz yere bağlanır. Bu, sunucunun yüksek yük koşullarında işleyebileceği trafik miktarını sınırlar. Zaman uyumsuz programlamada, bir web hizmetinin veya veritabanının veri döndürmesini bekleyen iş parçacıkları, alınan veriler alınana kadar yeni isteklere hizmet vermek üzere serbestleştirilir. Meşgul bir web sunucusunda yüzlerce veya binlerce istek hemen işlenebilir ve aksi takdirde iş parçacıklarının boşaltılması beklenebilir.

Daha önce gördüğünüz gibi, web sitenizi işleyen web sunucularının sayısını artırmak kadar kolayca azaltabilirsiniz. Bu nedenle, bir sunucu daha yüksek aktarım hızı elde edebilirse, bunların çoğuna ihtiyacınız yoktur ve belirli bir trafik hacmi için normalde yapabileceğinizden daha az sunucuya ihtiyacınız olduğundan maliyetlerinizi azaltabilirsiniz.

.NET 4.5 zaman uyumsuz programlama modeli desteği, Web Forms, MVC ve Web API için ASP.NET 4.5'te; Entity Framework 6'da ve Windows Azure Depolama API'sinde bulunur.

ASP.NET 4.5'te zaman uyumsuz destek

ASP.NET 4.5'te, zaman uyumsuz programlama desteği yalnızca dile değil MVC, Web Forms ve Web API çerçevelerine de eklenmiştir. Örneğin, ASP.NET MVC denetleyicisi eylem yöntemi bir web isteğinden veri alır ve verileri bir görünüme geçirir ve ardından tarayıcıya gönderilecek HTML'yi oluşturur. Genellikle eylem yönteminin bir web sayfasında görüntülemek veya bir web sayfasına girilen verileri kaydetmek için bir veritabanından veya web hizmetinden veri alması gerekir. Bu senaryolarda eylem yöntemini zaman uyumsuz hale getirmek kolaydır: ActionResult nesnesi döndürmek yerine Task<ActionResult> döndürür ve yöntemi zaman uyumsuz anahtar sözcüğüyle işaretlersiniz. yönteminin içinde, bir kod satırı bekleme süresi içeren bir işlemi başlattığınızda, bunu await anahtar sözcüğüyle işaretlersiniz.

Veritabanı sorgusu için depo yöntemini çağıran basit bir eylem yöntemi aşağıdadır:

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

    return View(result);
}

Veritabanı çağrısını zaman uyumsuz olarak işleyen yöntem de şu şekildedir:

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

    return View(result);
}

Kapaklar altında derleyici uygun zaman uyumsuz kodu oluşturur. Uygulama çağrısı FindTaskByIdAsyncyaptığında, ASP.NET isteği yapar FindTask ve ardından çalışan iş parçacığını çözerek başka bir isteği işlemek için kullanılabilir hale getirir. FindTask İstek tamamlandığında, bu çağrıdan sonra gelen kodu işlemeye devam etmek için bir iş parçacığı yeniden başlatılır. İsteğin başlatıldığı zaman FindTask ile verilerin döndürüleceği zaman arasındaki ara sırasında, yararlı işler yapmak için kullanabileceğiniz ve aksi takdirde yanıt beklenirken bağlanacak bir iş parçacığınız olur.

Zaman uyumsuz kod için bazı ek yükler vardır, ancak düşük yük koşullarında bu ek yük göz ardı edilebilirken, yüksek yük koşullarında, aksi takdirde kullanılabilir iş parçacıkları beklenirken bekletilecek istekleri işleyebilirsiniz.

ASP.NET 1.1'den bu yana bu tür zaman uyumsuz programlamalar yapmak mümkündü, ancak yazması zor, hataya açık ve hata ayıklaması zordu. Artık ASP.NET 4.5'te kodlamayı basitleştirdiğimize göre artık bunu yapmamaya gerek yok.

Entity Framework 6'da zaman uyumsuz destek

4.5'teki zaman uyumsuz desteğin bir parçası olarak web hizmeti çağrıları, yuvalar ve dosya sistemi G/Ç için zaman uyumsuz destek gönderdik, ancak web uygulamaları için en yaygın desen bir veritabanına isabet etmektir ve veri kitaplıklarımız zaman uyumsuz desteği sağlamaz. Entity Framework 6 artık veritabanı erişimi için zaman uyumsuz destek ekliyor.

Entity Framework 6'da veritabanına bir sorgunun veya komutun gönderilmesine neden olan tüm yöntemlerin zaman uyumsuz sürümleri vardır. Buradaki örnekte Find yönteminin zaman uyumsuz sürümü gösterilmektedir.

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 eklemeler, silmeler, güncelleştirmeler ve basit bulmalar için değil, LINQ sorgularıyla da çalışır:

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

Yöntemin ToList bir Async sürümü vardır çünkü bu kodda veritabanına sorgu gönderilmesine neden olan yöntemdir. Where ve OrderByDescending yöntemleri yalnızca sorguyu yapılandırırken ToListAsync yöntemi sorguyu yürütür ve yanıtı değişkeninde result depolar.

Özet

Burada özetlenen web geliştirme en iyi uygulamalarını herhangi bir web programlama çerçevesinde ve herhangi bir bulut ortamında uygulayabilirsiniz, ancak bunu kolaylaştırmak için ASP.NET ve Windows Azure'da araçlarımız vardır. Bu desenleri izlerseniz web katmanınızın ölçeğini kolayca genişletebilir ve her sunucu daha fazla trafiği işleyebileceği için harcamalarınızı en aza indirirsiniz.

Sonraki bölümde bulutun çoklu oturum açma senaryolarını nasıl etkinleştirmiş olduğu anlatılmaktadır.

Kaynaklar

Daha fazla bilgi için aşağıdaki kaynaklara bakın.

Durum bilgisi olmayan web sunucuları:

CDN:

Zaman uyumsuz programlama:

Ek web geliştirme en iyi yöntemleri için aşağıdaki kaynaklara bakın: