Dayanıklılığın temelleri: yeniden deneme ve geri çekilme
Üstel geri çekilme ve titreşimle basit yeniden denemeler uygulayın; geçici ve kalıcı hataları ayırt edin, gecikmeleri sınırlayın ve iptal durumunda durun.
Dayanıklılığın temelleri: yeniden deneme ve geri çekilme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
Yeniden deneme ve Backoff neden gerekli
Hedef: Çağrıları dayanıklı hâle getirin.
- Geçici hataları yeniden deneyin
- Üstel Backoff ve rastgele sapma kullanın
- En fazla deneme sayısını ve en uzun gecikmeyi belirleyin
- Kritik hatalarda veya iptal durumunda durun
Hataları sınıflandırma
Geçici: zaman aşımları, 429/5xx yanıtları, geçici ağ sorunları.
Kritik: hatalı istek, yetkisiz erişim, doğrulama hataları — yeniden denemeyin.
Kural: yalnızca daha sonra başarılı olabilecek işlemleri yeniden deneyin.
Backoff yardımcısı
Küçük bir yardımcı, her denemede gecikmeyi artırır ve küçük bir rastgele sapma ekler; ayrıca azami gecikmeyi sınırlar.
using System;
using System.Threading;
using System.Threading.Tasks;
public static class Backoff
{
// Compute delay = min(base * 2^attempt, cap) + jitter
public static int ComputeDelayMs(int attempt, int baseMs, int capMs, int jitterMs, Random rng)
{
long exp = (long)baseMs << attempt; // base * 2^attempt
if (exp > capMs) exp = capMs;
int jitter = rng.Next(0, jitterMs + 1); // [0..jitterMs]
return (int)exp + jitter;
}
}
public class Program
{
public static void Main(string[] args)
{
Random rng = new Random(123);
for (int i = 0; i < 5; i++)
{
int d = Backoff.ComputeDelayMs(i, 100, 2000, 50, rng);
Console.WriteLine("Attempt " + i + " -> " + d + " ms");
}
}
}
Yeniden deneme sarmalayıcısı
Çağrıyı sarın: yalnızca geçici özel durumlarda yeniden deneyin, diğerlerinde durun. Her yeniden denemeden önce rastgele sapmayla daha uzun bekleyin.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static readonly Random Rng = new Random();
// Simulate an operation that sometimes fails transiently.
static async Task<string> FlakyAsync()
{
await Task.Delay(60);
// 50% chance of transient failure
if (DateTime.UtcNow.Ticks % 2 == 0) throw new TimeoutException("Transient");
return "OK";
}
static async Task<T> RetryAsync<T>(Func<Task<T>> action, int maxAttempts)
{
int baseMs = 100, capMs = 2000, jitterMs = 50;
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
try
{
return await action();
}
catch (TimeoutException)
{
if (attempt == maxAttempts - 1) throw; // out of retries
int delay = Backoff.ComputeDelayMs(attempt, baseMs, capMs, jitterMs, Rng);
await Task.Delay(delay);
}
catch (Exception)
{
// Non-transient (unknown) -> do not retry
throw;
}
}
throw new InvalidOperationException("Unreachable");
}
public static void Main(string[] args)
{
try
{
string s = RetryAsync(FlakyAsync, 5).GetAwaiter().GetResult();
Console.WriteLine("Result: " + s);
}
catch (Exception ex)
{
Console.WriteLine("Failed: " + ex.GetType().Name);
}
}
}
Bütçeyle sınırlı yeniden denemeler
İptal yoluyla bir genel bütçe ekleyin: belirteçleri hem işleme hem de Backoff gecikmelerine iletin.
using System;
using System.Threading;
using System.Threading.Tasks;
public static class RetryUtil
{
static readonly Random Rng = new Random();
public static async Task<T> RetryAsync<T>(Func<CancellationToken, Task<T>> action, int maxAttempts, CancellationToken ct)
{
int baseMs = 100, capMs = 1500, jitterMs = 50;
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
ct.ThrowIfCancellationRequested();
try
{
return await action(ct);
}
catch (TimeoutException)
{
if (attempt == maxAttempts - 1) throw;
int delay = Backoff.ComputeDelayMs(attempt, baseMs, capMs, jitterMs, Rng);
await Task.Delay(delay, ct); // pass token so we can abort waiting
}
}
throw new InvalidOperationException("Unreachable");
}
}
public class Program
{
static async Task<string> SometimesSlowAsync(CancellationToken ct)
{
await Task.Delay(200, ct);
if (DateTime.UtcNow.Millisecond % 3 != 0) throw new TimeoutException("Transient");
return "OK";
}
public static void Main(string[] args)
{
var cts = new CancellationTokenSource();
cts.CancelAfter(800); // overall budget
try
{
string s = RetryUtil.RetryAsync(SometimesSlowAsync, 5, cts.Token).GetAwaiter().GetResult();
Console.WriteLine("Done: " + s);
}
catch (OperationCanceledException) { Console.WriteLine("Canceled"); }
catch (Exception ex) { Console.WriteLine("Failed: " + ex.Message); }
}
}
Yönergeler
İpuçları:
- Yalnızca tekrarlandığında aynı sonucu veren çağrıları yeniden deneyin.
- Deneme sayısı ve gecikme için üst sınırlar kullanın.
- Yoğun istek patlamalarını önlemek için küçük bir rastgele sapma ekleyin.
- Son başarısızlığı nedeni ve deneme sayısıyla birlikte günlüğe kaydedin.
Backoff tanımı
Özet
Özet: Yalnızca geçici hataları yeniden deneyin, gecikmeleri bir üst sınırla üstel olarak artırın, rastgele sapma ekleyin ve iptal veya kritik hatalarda durun.
Sıkça Sorulan Sorular
“Dayanıklılığın temelleri: yeniden deneme ve geri çekilme” dersi ücretsiz mi?
Evet — “Dayanıklılığın temelleri: yeniden deneme ve geri çekilme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“Dayanıklılığın temelleri: yeniden deneme ve geri çekilme” dersinde ne öğreneceğim?
Üstel geri çekilme ve titreşimle basit yeniden denemeler uygulayın; geçici ve kalıcı hataları ayırt edin, gecikmeleri sınırlayın ve iptal durumunda durun. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.
“Dayanıklılığın temelleri: yeniden deneme ve geri çekilme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- CancellationToken kalıpları; iş birliğine dayalı iptal
- Zaman aşimleri, IProgress ve async kaynak temizleme (öykünme)
- Dayanıklılığın temelleri: yeniden deneme ve geri çekilme