.NET ile Dayanıklı REST API Tasarımı

.NET ile Dayanıklı REST API Tasarımı

.NET ile Dayanıklı REST API Tasarımı

Dağıtık sistemlerde her ağ çağrısı başarısız olabilir. Uzak servis yavaşlayabilir, bağlantı kesilebilir veya yanıt alınmış olsa bile istemci timeout görebilir. Dayanıklı bir API bu ihtimalleri istisna olarak değil normal çalışma koşulu olarak kabul eder ve kontrollü bir bozulma stratejisi tasarlar.

Önce zaman bütçesini belirleyin

Sonsuz bekleyen istekler thread ve bağlantı havuzlarını tüketir. Her dış çağrının bir timeout değeri, bütün isteğin ise daha geniş fakat sınırlı bir toplam zaman bütçesi olmalıdır. Retry yalnızca geçici hatalarda ve idempotent işlemlerde kullanılmalıdır. Circuit breaker, sürekli hata veren servise yeni yük göndermeyi kısa süreliğine durdurur; bulkhead yaklaşımı da bir bağımlılığın bütün sistemi tüketmesini engeller.

İdempotent sipariş isteği

Ödeme veya sipariş gibi POST işlemlerini körlemesine tekrar etmek çift kayıt oluşturabilir. İstemcinin ürettiği idempotency anahtarı, aynı mantıksal isteğin yalnızca bir kez işlenmesini sağlar.

app.MapPost("/orders", async (
    HttpRequest request,
    CreateOrder command,
    OrderService service,
    CancellationToken ct) =>
{
    var key = request.Headers["Idempotency-Key"].ToString();
    if (string.IsNullOrWhiteSpace(key))
        return Results.BadRequest("Idempotency-Key is required");

    var result = await service.CreateOnceAsync(key, command, ct);
    return Results.Ok(result);
});

CreateOnceAsync anahtarı benzersiz indeksli bir tabloda sonuçla birlikte saklar. Aynı anahtar tekrar geldiğinde işlem yeniden yapılmaz, önceki sonuç döndürülür. Bu tasarım retry politikasının iş verisini çoğaltmadan kullanılabilmesini sağlar.

Uygulama kontrol listesi

  1. Her dış servis için bağlantı ve istek timeout değerlerini ölçülebilir biçimde tanımlayın.
  2. Retry politikasını yalnızca 408, 429 ve seçili 5xx gibi geçici durumlarla sınırlandırın.
  3. Retry denemelerine exponential backoff ve rastgele jitter ekleyerek eşzamanlı yük dalgasını azaltın.
  4. Kritik POST işlemlerinde idempotency anahtarı ve veritabanı benzersiz kısıtı kullanın.
  5. Circuit breaker durumunu metric ve loglarla izleyip alarm üretin.

Kaçınılması gerekenler

  • Bütün hataları üç kez tekrar ederek kalıcı hataları büyütmek.
  • Timeout değerini yalnızca HttpClient üzerinde bırakıp uçtan uca istek bütçesi tanımlamamak.
  • Hata ayrıntılarını doğrudan kullanıcıya döndürerek iç sistem bilgilerini açığa çıkarmak.

Sonuç

Dayanıklılık tek bir NuGet paketi eklemekten ibaret değildir; iş semantiği, zaman bütçesi ve gözlemlenebilirlik birlikte tasarlanmalıdır. Küçük bir API için timeout ve kontrollü retry ile başlayın. Ardından ölçümlere göre circuit breaker, idempotency ve yük izolasyonu ekleyin. Böylece sistem hatayı gizlemek yerine etkisini sınırlar ve hızlı toparlanır.

0 Yorumlar

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.