Aracılığıyla paylaş


Dayanıklı uygulama geliştirmeye giriş

Dayanıklılık, bir uygulamanın geçici hatalardan kurtarma ve çalışmaya devam etme yeteneğidir. .NET programlama bağlamında dayanıklılık, hataları düzgün bir şekilde işleyebilen ve hızlı bir şekilde kurtarabilen uygulamalar tasarlanarak elde edilir. .NET'te dayanıklı uygulamalar oluşturmaya yardımcı olmak için NuGet'te aşağıdaki iki paket kullanılabilir:

NuGet paketi Açıklama
📦 Microsoft.Extensions.Resilience Uygulamaları geçici hatalara karşı sağlamlaştırma mekanizmaları sağlar. Bu paketin 10.x.x sürümleri .NET, .NET Framework ve .NET Standard'ı hedefleyen uygulamaları destekler.
📦 Microsoft.Extensions.Http.Resilience HttpClient sınıfı için özellikle direnç mekanizmaları sağlar.

Bu iki NuGet paketi, popüler bir açık kaynak projesi olan Polly'nin üzerine kurulmuştur. Polly, geliştiricilerin yeniden deneme, devre kesici, zaman aşımı, bölme ucu yalıtımı, hız sınırlama, geri dönüş ve geçiş yapma gibi stratejileri akıcı ve iş parçacığı açısından güvenli bir şekilde ifade etmesine olanak tanıyan bir .NET dayanıklılığı ve geçici hata işleme kitaplığıdır.

Önemli

Microsoft.Extensions.Http.Polly NuGet paketi kullanım dışıdır. Bunun yerine yukarıda belirtilen paketlerden birini kullanın.

Başlayın

.NET'te dayanıklılığı kullanmaya başlamak için Microsoft.Extensions.Resilience NuGet paketinin en son sürümünü yükleyin.

dotnet add package Microsoft.Extensions.Resilience

Daha fazla bilgi için bkz. dotnet paket ekleme veya .NET uygulamalarında paket bağımlılıklarını yönetme.

Dayanıklılık işlem hattı oluşturma

Dayanıklılığı kullanmak için önce dayanıklılık tabanlı stratejilerden oluşan bir işlem hattı oluşturmanız gerekir. Yapılandırılan her strateji, yapılandırma sırasına göre yürütülür. Başka bir deyişle sıra önemlidir. Giriş noktası, IServiceCollection türü üzerinde, AddResiliencePipeline adlı bir uzantı yöntemidir. Bu yöntem işlem hattının tanımlayıcısını ve işlem hattını yapılandıran bir temsilciyi alır. Temsilciye, işlem hattına dayanıklılık stratejileri eklemek amacıyla kullanılan ResiliencePipelineBuilder örneği geçirilir.

Aşağıdaki dize tabanlı key örneği göz önünde bulundurun:

using Microsoft.Extensions.DependencyInjection;
using Polly;
using Polly.CircuitBreaker;
using Polly.Registry;
using Polly.Retry;
using Polly.Timeout;

var services = new ServiceCollection();

const string key = "Retry-Timeout";

services.AddResiliencePipeline(key, static builder =>
{
    // See: https://www.pollydocs.org/strategies/retry.html
    builder.AddRetry(new RetryStrategyOptions
    {
        ShouldHandle = new PredicateBuilder().Handle<TimeoutRejectedException>()
    });

    // See: https://www.pollydocs.org/strategies/timeout.html
    builder.AddTimeout(TimeSpan.FromSeconds(1.5));
});

Önceki kod:

  • Yeni bir ServiceCollection örneği oluşturur.
  • İşlem hattını tanımlamak için bir key tanımlar.
  • Örnekteki ServiceCollection örneğine dayanıklı işlem hattı ekler.
  • İşlem hattını yeniden deneme ve zaman aşımı stratejileriyle yapılandırır.

Her işlem hattı belirli keybir için yapılandırılır ve her key biri sağlayıcıdan işlem hattını alırken ilgili ResiliencePipeline işlem hattını tanımlamak için kullanılır. key, yönteminin AddResiliencePipeline genel tür parametresidir.

Dayanıklılık işlem hattı oluşturucu uzantıları

İşlem hattına strateji eklemek için örnekteki kullanılabilir Add* uzantı yöntemlerinden herhangi birini çağırın ResiliencePipelineBuilder .

  • AddRetry: Sorun geçici olduğunda ve ortadan kalkabileceğinden yararlı olan bir şey başarısız olursa yeniden deneyin.
  • AddCircuitBreaker: Bir şeyin bozuk veya meşgul olup olmadığını denemeyi bırakın, bu da boşa harcanan zamanı önleyerek ve işleri daha da kötü hale getirerek size fayda sağlar.
  • AddTimeout: Kaynakları serbest bırakarak performansı geliştirebilecek bir şey çok uzun sürerse vazgeçin.
  • AddRateLimiter: Gelen yükü denetlemenizi sağlayan kaç isteği kabul ettiğinizi sınırlayın.
  • AddConcurrencyLimiter: Kaç istekte bulunabileceğinizi sınırlayın; bu da giden yükü denetlemenizi sağlar.
  • AddFallback: Kullanıcı deneyimini geliştiren hatalarla karşılaşırken başka bir şey yapın.
  • AddHedging: Yüksek gecikme süresi veya hata durumunda birden çok istekte bulunun ve bu da yanıt hızını geliştirebilir.

Daha fazla bilgi için bkz. Dayanıklılık stratejileri. Örnekler için bkz. Dayanıklı HTTP uygulamaları oluşturma: Temel geliştirme desenleri.

Ölçüm zenginleştirmesi

Zenginleştirme , iyi bilinen durumdaki telemetri verilerinin ad/değer çiftleri biçiminde otomatik olarak genişletilmesidir. Örneğin, bir uygulama, bazı işlemlerin sonucunu temsil etmek için işlemi ve sonuç kodunu sütunlar olarak içeren bir günlük yayabilir. Bu durumda ve çevre bağlamına bağlı olarak zenginleştirme, telemetri arka planına gönderilirken günlüğe Küme adı, İşlem adı, Bölge, Kiracı Kimliği ve diğer bilgileri ekler. Zenginleştirme eklendiğinde, zenginleştirilmiş ölçümlerden yararlanmak için uygulama kodunun ek bir işlem yapması gerekmez.

Zenginleştirme nasıl çalışır?

Günlükler ve ölçümler oluşturan 1.000 genel dağıtılmış hizmet örneğini düşünün. Hizmet panonuzda bir sorunla karşılaştığınızda sorunlu bölgeyi veya veri merkezini hızla tanımlamak çok önemlidir. Zenginleştirme, ölçüm kayıtlarının dağıtılmış sistemlerdeki hataları saptamak için gerekli bilgileri içermesini sağlar. Zenginleştirme olmadan, bu durumu dahili olarak yönetmek, günlüğe kaydetme işlemiyle tümleştirmek ve el ile iletmek uygulama koduna yük olur. Zenginleştirme, uygulamanın mantığını etkilemeden sorunsuz bir şekilde işleyerek bu süreci basitleştirir.

Dayanıklılık söz konusu olduğunda, zenginleştirme eklediğinizde giden telemetriye aşağıdaki boyutlar eklenir:

  • error.type: Özel durum bilgilerinin düşük kardinalite sürümü.
  • request.name: İsteğin adı.
  • request.dependency.name: Bağımlılığın adı.

Kapakların altında dayanıklılık zenginleştirmesi Polly'nin Telemetrisi üzerine kurulmuştur MeteringEnricher. Daha fazla bilgi için bkz . Polly: Ölçüm zenginleştirmesi.

Dayanıklılık zenginleştirmesi ekleme

Dayanıklılık işlem hattını kaydetmeye ek olarak, dayanıklılık zenginleştirmesini de kaydedebilirsiniz. Zenginleştirme eklemek için AddResilienceEnricher(IServiceCollection) uzantı yöntemini IServiceCollection örneği üzerinde çağırın.

services.AddResilienceEnricher();

Uzantı yöntemini çağırarak AddResilienceEnricher , temel Polly kitaplığında yerleşik olarak bulunan varsayılanların üzerine boyutlar eklersiniz. Aşağıdaki zenginleştirme boyutları eklenir:

Dayanıklılık hattını kullan

Yapılandırılmış bir dayanıklılık işlem hattını kullanmak için işlem hattını bir ResiliencePipelineProvider<TKey> içinden almanız gerekir. İşlem hattını daha önce eklediğinizde key türündeydi string, bu nedenle işlem hattını ResiliencePipelineProvider<string> içinden almanız gerekir.

using ServiceProvider provider = services.BuildServiceProvider();

ResiliencePipelineProvider<string> pipelineProvider =
    provider.GetRequiredService<ResiliencePipelineProvider<string>>();

ResiliencePipeline pipeline = pipelineProvider.GetPipeline(key);

Önceki kod:

  • Örnekten ServiceProvider bir ServiceCollection oluşturur.
  • Hizmet sağlayıcısından ResiliencePipelineProvider<string> alır.
  • ResiliencePipeline içinden ResiliencePipelineProvider<string> öğesini alır.

Dayanıklılık işlem hattını çalıştır

Dayanıklılık işlem hattını kullanmak için örnekteki kullanılabilir Execute* yöntemlerden herhangi birini çağırın ResiliencePipeline . Örneğin, yönteme örnek bir çağrı düşünün ExecuteAsync :

await pipeline.ExecuteAsync(static cancellationToken =>
{
    // Code that could potentially fail.

    return ValueTask.CompletedTask;
});

Yukarıdaki kod, yönteminin içinde temsilciyi ExecuteAsync yürütür. Hatalar olduğunda, yapılandırılan stratejiler yürütülür. Örneğin, RetryStrategy üç kez yeniden denemeye göre yapılandırılmışsa, hata yayılmadan önce temsilci dört kez çalıştırılır (bir ilk deneme artı üç yeniden deneme denemesi).

Ayrıca bakınız