Circuit Breaker'ı Her Yere Koymayın
Kendi veritabanınız hasta değildir

Breaker'ın cümlesi net: karşı taraf hasta, ben de onu çağırarak daha hasta etmeyeyim, kendim de beklemeyeyim. Cümle, dışarıdaki bir komşu içindir. Komşu yoksa kırılacak devre de yoktur.
Kendi Postgres'ine breaker koyan kod gördüm. Pool dolunca breaker açıldı, uygulama 'stok servisi yok' sandı, aslında kendisiydi. Kullanıcı 503 gördü, operasyon replica ekledi, kırıcı kapalı kaldı çünkü eşik hâlâ eski. Alet, teşhisi tersine çevirmişti.
Nereye
Dış ödeme, SMS, kur, kargo takip. Timeout'um var, retry bütçem var, düşmesine izinli bir özellik. Orada breaker, fırtınayı kısaltır. Aynı pipeline'da sonsuz retry varsa breaker hiç açılmaz gibi durur; aslında çağrı sayısı artar. İkisini birlikte kurun.
builder.Services.AddHttpClient(c =>
{
c.BaseAddress = new Uri(builder.Configuration["Rates:BaseUrl"]!);
c.Timeout = TimeSpan.FromSeconds(2);
})
.AddTransientHttpErrorPolicy(p => p.CircuitBreakerAsync(
handledEventsAllowedBeforeBreaking: 8,
durationOfBreak: TimeSpan.FromSeconds(20)));
Eşik, 'üç hata' ezberi değil. Trafiğe göre. Saniyede iki çağrıda üç hata, bir gece bakımı. Saniyede iki binde üç hata, gürültü. Eşiği ölçmeden kopyalamayın.
Nereye değil
Kendi veritabanı, kendi diski, aynı monolith içindeki modül. Bunlar komşu değil, ev. Ev yavaşsa kapıyı kilitlemek, oturma odasını korumaz. Pool, timeout, sorgu; asıl iş orada. Breaker, kötü sorguyu gizler.
Her HttpClient'a varsayılan kırıcı da istemiyorum. İçerideki üç servis birbirine kırıcı takınca, birinin yavaşlığı diğerinin 'yok' demesine yol açar, yok diyen üçüncüyü de kapatır. Kaskad'ı önlemek için taktığınız alet, kaskadın kendisi olur.
Kırıcı bir süs değil, bir komşu politikası. Komşu yoksa takmayın. Varsa eşik, süre ve açıkken kullanıcıya ne diyeceğiniz aynı PR'da dursun. 'Biraz 503' bir politika değildir.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap