Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
keytanı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:
- Özel durum zenginleştirmesi, telemetride kullanılmak üzere özel durumları özetlemek için bir mekanizma sağlayan IExceptionSummarizer temellidir. Daha fazla bilgi için bkz. Özel durum özetleme.
- Telemetri için istek meta verilerini tutan RequestMetadata'e dayalı olarak meta veri zenginleştirme talebi. Daha fazla bilgi için bkz . Polly: Telemetri ölçümleri.
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
ServiceProviderbirServiceCollectionoluşturur. - Hizmet sağlayıcısından
ResiliencePipelineProvider<string>alır. -
ResiliencePipelineiçindenResiliencePipelineProvider<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).