Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Background Job'larda Retry ve Idempotency: At-Least-Once Gerçeğiyle Yaşamak
Background job en az bir kez, bazen iki kez çalışır; retry bunu daha da olası kılar. Hangfire varsayılan olarak 10 kez artan aralıklarla dener, kalıcı hatalar ExceptOn ile retry'dan çıkarılır; Quartz 4'te retry policy açıkça tanımlanır. "Önce kontrol et, sonra gönder" iki eşzamanlı çalışmada iki e-posta üretir; unique key ile önce sahiplenmek tek e-postaya indirir, dış API'ye Idempotency-Key başlığı aynı işi uçtan uca yapar.
Consumer'da Retry ve Redelivery: Immediate, Delayed ve Exponential Backoff
Geçici hatayı kısa in-memory retry'la, uzun beklemeyi broker'la çöz; kalıcı hatayı hiç deneme, DLQ'ya gönder. RabbitMQ 4.4'te nack ile requeue'nun 5 saniyede 8036 teslimlik döngüsü, TTL + DLX bekleme queue'ları, quorum queue'nun yerleşik delayed retry'ı, Service Bus'ta scheduled retry, Kafka retry topic'leri ve MassTransit UseMessageRetry gerçek çıktılarla.
Reliability Pattern'leri: Timeout, Retry, Backoff + Jitter, Circuit Breaker ve Load Shedding
Yavaş ya da çökmüş bir bağımlılığa karşı sırayla p99.9'a göre seçilmiş timeout, tek katmanda ve yalnız idempotent işlemde jitter'lı retry, retry budget, bağımlılık başına circuit breaker ve bulkhead, en sonda load shedding ve graceful degradation gerekir. Retry amplification (27 ve 243 çağrı), jitter, %10 retry budget ve circuit breaker'ın gerçek simülasyon çıktıları, failover ve .NET'in standard resilience handler varsayılanları.