Polly ücreti sonrası .NET 10'da HTTP resilience: üç seçenek
Polly'nin 16 Kasım 2026'da başlayan Open Source Maintenance Fee'si çoğu takımı doğrudan etkilemiyor, ama bağımlılık grafiğinden Polly'yi tamamen çıkarmak isteyenler için üç yol var. Mukesh Murugan, Microsoft.Extensions.Http.Resilience, Kevlar ve elle yazılmış DelegatingHandler seçeneklerini aynı hatalı API üzerinde test edip sonuçları karşılaştırıyor.
Kilit noktalar
- Ücret yalnızca 16 Kasım 2026 sonrası çıkacak yeni major Polly sürümüne doğrudan referans verenleri kapsıyor; mevcut 8.x sürümleri ücretsiz
- Microsoft.Extensions.Http.Resilience üzerinden gelen Polly bağımlılığı muaf; `dotnet list package --include-transitive` ile durumunuzu kontrol edin
- `AddStandardResilienceHandler()` varsayılan olarak POST isteklerini de tekrar deniyor; idempotent olmayan endpoint'lerde `DisableForUnsafeHttpMethods()` ekleyin
- Kevlar `AddStandardShield()` ile Polly'siz bir pipeline sunuyor: 30 sn toplam timeout, 10 sn deneme timeout'u, jitter'lı 3 retry
- Elle yazılan circuit breaker state'i handler içinde tutulmamalı, çünkü IHttpClientFactory handler zincirini iki dakikada bir yeniden oluşturuyor
- Her downstream bağımlılık için ayrı named client kullanın; paylaşılan client önceki hataların circuit'ü erken açmasına yol açıyor
Polly, Temmuz 2026'da Open Source Maintenance Fee modeline geçti; kaynak kodu BSD-3-Clause lisansında kalıyor ve 16 Kasım'da hiçbir şey bozulmuyor. Ücret yalnızca o tarihten sonra çıkacak yeni major sürüme yapılan doğrudan referanslar için geçerli: aylık 20 dolar, organizasyon başına, ürününden en az 20.000 dolar gelir elde eden şirketler için. Microsoft.Extensions.Http.Resilience üzerinden gelen transitive kullanım muaf. `dotnet list package --include-transitive` çıktısında Polly "Top-level Package" altındaysa doğrudan kullanıcısınız.
Alternatiflerin ilki Microsoft'un `AddStandardResilienceHandler()` metodu; yazar `DisableForUnsafeHttpMethods()` çağrısını şart koşuyor, çünkü varsayılan haliyle 503 alan bir POST tekrar denenip ikinci kez sipariş oluşturdu. Kevlar, `AddStandardShield()` ile benzer bir pipeline sunuyor ama varsayılanları farklı ve henüz tek maintainer'a sahip. Elle yazılan yol ise üç DelegatingHandler ve circuit state'i handler dışında tutan bir sınıf gerektiriyor; çünkü `IHttpClientFactory` zinciri iki dakikada bir yeniden kuruyor.
Gerçek dünyada kullanımı
- Ödeme veya sipariş API'si gibi idempotent olmayan endpoint'lere POST atan bir e-ticaret backend'i
- Polly'yi bağımlılık grafiğinden çıkarması gereken, kurumsal lisans denetiminden geçen bir mikroservis
- Birden fazla üçüncü parti servise (kargo, ödeme, SMS) bağlanan ve her biri için ayrı timeout/circuit ayarı isteyen bir entegrasyon katmanı
- Hatalı servis çağrılarının tüm isteği kilitlemesini engellemek isteyen bir arka plan worker'ı
Neden önemli
Polly'nin lisans modeli değişse de çoğu takım için doğru hamle ücret ödemek değil, doğrudan referansı kaldırıp Microsoft paketine geçmek; ancak varsayılan retry davranışı idempotent olmayan endpoint'lerde sessizce çift kayıt üretebiliyor.