Aracılığıyla paylaş


Uygulama dayanıklılığı desenleri

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Azure için Buluta Özel .NET Uygulamaları Tasarlama adlı e-Kitap'tan bir alıntıdır.

Cloud Native .NET apps for Azure eBook cover thumbnail.

İlk savunma hattı, uygulama dayanıklılığıdır.

Kendi dayanıklılık çerçevenizi yazmak için çok zaman ayırabilirsiniz ancak bu tür ürünler zaten mevcuttur. Polly , geliştiricilerin dayanıklılık ilkelerini akıcı ve iş parçacığı açısından güvenli bir şekilde ifade etmesine olanak tanıyan kapsamlı bir .NET dayanıklılığı ve geçici hata işleme kitaplığıdır. Polly, .NET Framework veya .NET 7 ile oluşturulan uygulamaları hedefler. Aşağıdaki tabloda, Polly Kitaplığı'nda bulunan adlı policiesdayanıklılık özellikleri açıklanmaktadır. Bunlar tek tek uygulanabilir veya birlikte gruplandırılabilir.

İlke Deneyim
Yeniden Dene Belirlenen işlemlerde yeniden deneme işlemlerini yapılandırılır.
Devre Kesici Hataların yapılandırılmış eşiği aştığı önceden tanımlanmış bir dönem için istenen işlemleri engeller
Timeout Çağıranın yanıt bekleyebileceği sürenin sınırını yerleştirir.
Bölme Perdesi Başarısız çağrıların bir kaynağı batırmasını önlemek için eylemleri sabit boyutlu kaynak havuzuyla kısıtlar.
Önbellek Yanıtları otomatik olarak depolar.
Geri dönüş Bir hata üzerine yapılandırılmış davranışı tanımlar.

Önceki şekilde, ister dış istemciden ister arka uç hizmetinden gelen istek iletileri için dayanıklılık ilkelerinin nasıl uygulandığına dikkat edin. Amaç, kısa süre kullanılamayabilecek bir hizmet isteğini telafi etmektir. Bu kısa süreli kesintiler genellikle aşağıdaki tabloda gösterilen HTTP durum kodlarıyla kendini gösterir.

HTTP Durum Kodu Neden
404 Bulunamadı
408 İstek zaman aşımı
Kategori 429 Çok fazla istek var (büyük olasılıkla kısıtlanmışsınızdır)
502 Hatalı ağ geçidi
503 Hizmet kullanılamıyor
504 Ağ geçidi zaman aşımı

Soru: 403 - Yasak http durum kodunu yeniden dener misiniz? Hayır Burada sistem düzgün çalışıyor, ancak çağıranı istenen işlemi gerçekleştirme yetkisine sahip olmadığını bildiriyor. Yalnızca hatalardan kaynaklanan işlemleri yeniden denemek için dikkatli olunmalıdır.

Bölüm 1'de önerilen şekilde, buluta özel uygulamalar oluşturmak için Microsoft geliştiricileri .NET platformunu hedeflemelidir. Sürüm 2.1, URL tabanlı kaynaklarla etkileşime geçilmesi için HTTP İstemci örnekleri oluşturmaya yönelik HTTPClientFactory kitaplığını kullanıma sunulmuştur. Özgün HTTPClient sınıfının yerini alan fabrika sınıfı, biri Polly dayanıklılık kitaplığıyla sıkı tümleştirme olan birçok gelişmiş özelliği destekler. Bununla, kısmi hataları ve bağlantı sorunlarını işlemek için uygulama Başlangıç sınıfında dayanıklılık ilkelerini kolayca tanımlayabilirsiniz.

Şimdi yeniden deneme ve devre kesici desenlerini genişletelim.

Yeniden deneme düzeni

Dağıtılmış buluta özel bir ortamda, hizmetlere ve bulut kaynaklarına yapılan çağrılar, genellikle kısa bir süre sonra kendilerini düzelten geçici (kısa süreli) hatalar nedeniyle başarısız olabilir. Yeniden deneme stratejisi uygulamak, buluta özel bir hizmetin bu senaryoları azaltmasına yardımcı olur.

Yeniden Deneme düzeni, hizmetin başarısız istek işlemini birkaç kez yeniden denemesine olanak tanır ve bekleme süresini katlanarak artırır. Şekil 6-2'de yeniden deneme işlemi gösterilmektedir.

Retry pattern in action

Şekil 6-2. Yeniden deneme deseni çalışır durumda

Önceki şekilde, bir istek işlemi için yeniden deneme düzeni uygulanmıştır. İki saniyede başlayan bir geri alma aralığı (bekleme süresi) ile başarısız olmadan önce en fazla dört yeniden denemeye izin verecek şekilde yapılandırılır ve bu da sonraki her deneme için katlanarak iki katına çıkar.

  • İlk çağırma başarısız olur ve 500 http durum kodunu döndürür. Uygulama iki saniye bekler ve çağrıyı yeniden denenir.
  • İkinci çağrı da başarısız olur ve 500 http durum kodunu döndürür. Uygulama artık geri alma aralığını dört saniye olarak ikiye katlar ve çağrıyı yeniden dener.
  • Son olarak, üçüncü çağrı başarılı olur.
  • Bu senaryoda, yeniden deneme işlemi çağrıyı başarısız olmadan önce geri alma süresini iki katına çıkararak en fazla dört yeniden deneme girişiminde bulunuyacaktı.
  • 4. yeniden deneme girişimi başarısız olursa, sorunu düzgün bir şekilde işlemek için bir geri dönüş ilkesi çağrılır.

Hizmet süresinin kendi kendine düzeltilmesine izin vermek için çağrıyı yeniden denemeden önce geri alma süresini artırmak önemlidir. Yeterli düzeltme süresine izin vermek için üstel olarak artan bir geri alma (her yeniden denemede süreyi iki katına çıkarma) uygulamak en iyi yöntemdir.

Devre kesici deseni

Yeniden deneme düzeni kısmi bir hatada dolanık bir isteğin kurtarılmasında yardımcı olsa da, hataların çözülmesi daha uzun süreler gerektirecek öngörülemeyen olayların neden olabileceği durumlar vardır. Bu hataların önem derecesi kısmi bağlantı kaybıyla bir hizmetin tamamen çökmesi arasında değişebilir. Bu gibi durumlarda, bir uygulamanın başarılı olma olasılığı düşük bir işlemi sürekli olarak yeniden denemesi anlamsızdır.

İşleri daha da kötü hale getirmek için, yanıt vermeyen bir hizmette sürekli yeniden deneme işlemlerini yürütmek, sizi, hizmetinizi bellek, iş parçacıkları ve veritabanı bağlantıları gibi sürekli çağrılarla dolup taşan ve sistemin aynı kaynakları kullanan ilişkisiz bölümlerinde hataya neden olan kendi kendine uygulanan bir hizmet reddi senaryosuna taşıyabilir.

Bu gibi durumlarda, işlemin hemen başarısız olması ve yalnızca başarılı olma olasılığı varsa hizmeti çağırmayı denemesi tercih edilir.

Devre Kesici düzeni , uygulamanın başarısız olma olasılığı olan bir işlemi tekrar tekrar yürütmeye çalışmasını engelleyebilir. Önceden tanımlanmış sayıda başarısız çağrıdan sonra hizmete gelen tüm trafiği engeller. Düzenli aralıklarla, hatanın çözülmüş olup olmadığını belirlemek için bir deneme çağrısına izin verir. Şekil 6-3'te Devre Kesici düzeni çalışır durumda gösterilmiştir.

Circuit breaker pattern in action

Şekil 6-3. Devre kesici deseni çalışır durumda

Önceki şekilde, özgün yeniden deneme desenine bir Devre Kesici düzeni eklenmiştir. 100 başarısız istek sonrasında devre kesicilerin nasıl açıldığını ve artık hizmete çağrılara izin vermemeye dikkat edin. 30 saniye olarak ayarlanan CheckCircuit değeri, kitaplığın bir isteğin hizmete ne sıklıkta devam etmesine izin verdiği belirtir. Bu çağrı başarılı olursa bağlantı hattı kapanır ve hizmet bir kez daha trafiğe sunulur.

Devre Kesici düzeninin amacının Yeniden Deneme düzeninden farklı olduğunu unutmayın. Yeniden Deneme düzeni, bir uygulamanın başarılı olacağı beklentisi içinde bir işlemi yeniden denemesine olanak tanır. Devre Kesici düzeni, uygulamanın başarısız olma olasılığı olan bir işlem yapmasını engeller. Genellikle, bir uygulama bir devre kesici aracılığıyla bir işlemi çağırmak için Yeniden Deneme desenini kullanarak bu iki deseni birleştirir .

Dayanıklılığı test etme

Dayanıklılık testi her zaman uygulama işlevselliğini test ettiğiniz gibi yapılamaz (birim testleri, tümleştirme testleri vb. çalıştırılarak). Bunun yerine, uçtan uca iş yükünün yalnızca aralıklı olarak gerçekleşen hata koşullarında nasıl performans göstereceğini test etmeniz gerekir. Örneğin: işlemleri, süresi dolmuş sertifikaları kilitleyerek hataları ekleme, bağımlı hizmetleri kullanılamaz duruma getirme vb. Kaos maymunu gibi çerçeveler bu tür bir kaos testi için kullanılabilir.

Sorunlu istenen işlemleri işlemek için uygulama dayanıklılığı şarttır. Ama hikayenin sadece yarısı. Daha sonra Azure bulutunda kullanılabilen dayanıklılık özelliklerini ele alacağız.