.NET uygulamalarınızda karşılaşılan sonsuz askı (hang) sorunlarının ardındaki temel nedenleri ve bu durumun sistem kapasitenizi nasıl tükettiğini inceleyeceğiz. Süreçlerinizin sağlıklı çalışmasını sağlamak için zaman limitleri belirlemenin ve doğru şekilde uygulamanın yollarını adım adım açıklıyoruz.
Sonsuz Askıların Altında Yatan Gerçek: Kapasite Tıkanıklığı
Zaman limitlerinin olmaması performans sorunu değil, kapasite sorunudur. Bir çağrı sonsuza kadar bekleyebildiğinde, sisteminizin kaldıramayacağı kadar uzun süreler boyunca kaynakları meşgul eder. Bu durumda, işçi slotları, bağlantı havuzları, kilit mekanizmaları veya talep bütçeleri gibi kritik kaynaklar bloke olur.
Sistem dışarıdan bakıldığında "her şey yavaş" gibi görünse de aslında tamamlanamayan işlerin biriktiği bir kuyruk haline dönüşmektedir. Zaman limitleri, performans ayarı yapmak için değil, sistemin ne kadar bekleyebileceğine dair bir ürün kararıdır. Bu karar sayesinde, sisteminiz alternatif yollara yönelmeye başlar.
ASP.NET Projelerinizde Sorunun Kaynağını Belirleme
Değişiklikler yapmadan önce bekleyen işlemleri sınıflandırmanız gerekir. Aksi takdirde, her yerde sıkı zaman limitleri uygulamak sisteminizi kırılgan hale getirebilir. Aşağıdaki adımları izleyerek sorunun kaynağını hızlıca tespit edin:
- Yavaş yolda olan en önemli 3 bağımlılığı belirleyin (HTTP/SQL/vendör SDK)
- Ortalama değil, gözlemlenen en uzun süreleri kaydedin
- Zaman aşımından sonra işlemlerin durdurulup durdurulmadığını kontrol edin
- Yeniden deneme politikalarıyla toplam zaman bütçesini (zaman aşımı + yeniden denemeler) haritalayın
- Kuyruk derinliği, en eski işlem yaşı ve tamamlanmayan iş sayısındaki artışları izleyin
Aşağıdaki tabloda, hızlı müdahale için hangi belirtilere odaklanmanız gerektiğini bulabilirsiniz:
- İn-flight sayısı artıyor, tamamlanmalar düzleşiyor, CPU normal görünüyorsa: Kaynakları meşgul eden sonsuz bekleyişler olabilir. Kuyruk yaşını ve derinliğini kontrol edin. İlk güvenli adım olarak her bağımlılık için zaman limitleri ekleyin ve toplam bütçeyi belirleyin. İşlemleri sonlandırmak için iptal sinyallerini yaygınlaştırın.
- İstekler zaman aşımına uğruyor ama arka planda çalışmalar devam ediyorsa: Zaman aşımıyla birlikte iptal sinyallerinin yayılmaması nedeniyle zombi işler oluşabilir. Her asenkron çağrıya
CancellationTokeniletin veCancelAfterile bağlantılı CTS kullanın.
- Yeniden deneme politikaları durumu kötüleştiriyorsa: Zaman limitleriyle yeniden denemelerin tek bir bütçe olarak ele alınmaması sorunu ortaya çıkar. Toplam zaman bütçesini sınırlandırın ve bağımlılıkta yavaşlama olduğunda yeniden denemeyi durdurun.
- Tek bir bağımlılık tüm süreyi domine ediyorsa: SQL sorguları veya vendor SDK’lar zaman limitlerini sürekli aşabilir. Bu bağımlılık için koruma mekanizmaları (bulkhead) ve konservatif zaman limitleri belirleyin. Yedekleme yollarını ya da kuyruk mekanizmalarını devreye alın.
Eğer "Her talep veya işlem için toplam zaman bütçesi nedir?" sorusuna net bir yanıt veremiyorsanız, ilk eksiklik budur.
.NET Ortamlarında Sonsuz Bekleyişlerin Yaygın Nedenleri
Sonsuz bekleyişler genellikle tek bir hata değil, sistemin sınırsız bekleyişlere izin verdiği durumların bir bileşkesidir. Bu durumları doğuran yaygın desenler şunlardır:
- HTTP çağrılarında deneme bütçesi veya iptal sinyallerinin olmaması
- SQL komutlarının kilitler arkasında beklemesi ya da uzun sorguların operatör sınırlamasının olmaması
- Arka plan işlemlerinde maksimum çalışma süresi ve kalp atışı mekanizmasının bulunmaması
- Vendor sistemlerinde arıza yaşandığında bile sürekli yeniden denemeye devam edilmesi
Bu nedenle, uygulama ömrü sınırlamaları (process recycling) geçici bir rahatlama sağlar. Ancak bağımlılık sorununu çözmez; yalnızca bekleyen işleri ortadan kaldırır ve kaynakları serbest bırakır.
Kalıcı Çözüm: Zaman Bütçeleri, Yedekleme Yolları ve Durdurma Kuralları
Ekipler zaman limitleri uygulamaktan kaçınır çünkü kısa vadede daha fazla hata oluşabileceğini bilir. Ancak bu, yanlış bir sonuçtur.
Zaman limitleri sisteminizi kırılgan hale getirmez; zaten var olan kırılganlığı ortaya çıkarır: iptal sinyallerinin yayılmaması, yeniden denemelerin bekleme sürelerini artırması ve bütçe tükendiğinde yedek yolların olmaması.
Her talep veya işlem tipi için aşağıdaki üç kararı verin:
- Toplam bütçe: Sistem ne kadar süre bekleyebilir ve alternatif bir yol seçmelidir?
- Deneme bütçesi: Her bir bağımlılık çağrısının ne kadar süre kaynakları meşgul edebileceği?
- Durdurma kuralları: Bütçe tükendiğinde ne yapılmalıdır? Yeniden denemeye devam etmek yerine, izole etme, hiyerarşik yükseltme veya alternatif yanıtlar verme gibi adımlar atılabilir.
Gerçek dünya uygulamalarında işe yarayan yedekleme seçenekleri şunlardır:
- Net bir hata yanıtı verip çalışmayı durdurmak
- Önbelleklenmiş veya eski verileri sunmak
- İşlemleri sıraya alıp hemen yanıt vermek
- Kısmi yanıtlar üretmek (güvenli olduğu durumlarda)
Eğer tek davranışınız "sonsuza kadar beklemek" ise, bağımlılık sorunlarının sisteminizde kesinlikle felaketlere yol açacağını garanti etmiş olursunuz.
Uygulanabilir Bir Zaman Limitleri Matrisi Oluşturun
Mükemmel sayıları bulmanız gerekmez; tutarlı bütçeler ve operatör hikayeleri oluşturmanız yeterlidir. Toplam bütçeyi belirleyin, ardından içindeki bileşenlere daha küçük bütçeler ayırın. Basit ve sürdürülebilir bir yaklaşım benimseyin.
Kullanıcı odaklı web istekleri için başlangıç önerileri:
- Toplam bütçe: 800-1500 ms
- HTTP çağrıları için deneme bütçesi: 300-500 ms
- SQL sorguları için deneme bütçesi: 200-400 ms
- Yeniden deneme sayısı: 2-3 kez
Arka plan işlemleri (background jobs) için başlangıç önerileri:
- Toplam bütçe: 3000-5000 ms
- Dış API çağrıları için deneme bütçesi: 800-1200 ms
- Veritabanı işlemleri için deneme bütçesi: 600-1000 ms
- Yeniden deneme sayısı: 1-2 kez
Bu başlangıç değerleriyle başlayın ve sisteminizin davranışlarını izleyerek bütçeleri optimize edin. Kritik olan, kuralların tutarlı ve operatörler tarafından anlaşılır olmasıdır.
Zaman limitleri, sisteminizin dayanıklılığını artıran ve beklenmedik bağımlılık sorunlarında otomatik kurtarma sağlayan temel bir mekanizmadır. Bu kuralları doğru şekilde uyguladığınızda, ASP.NET projelerinizdeki sonsuz askı sorunlarını kalıcı olarak ortadan kaldırabilirsiniz. Unutmayın: Bekleyişlere sınır koymak, sisteminizin kapasitesini korumanın ilk adımıdır.
Yapay zeka özeti
ASP.NET projelerinizde sonsuz askı sorunlarını ve kapasite tıkanıklıklarını önlemek için zaman limitleri belirleme, iptal sinyallerini yayma ve yedek yollar oluşturma yöntemlerini keşfedin.