Dasar-dasar ketahanan: percobaan ulang & jeda bertahap
Implementasikan percobaan ulang sederhana dengan jeda eksponensial dan jitter; bedakan kesalahan sementara dan fatal; batasi jeda; hentikan saat dibatalkan.
Dasar-dasar ketahanan: percobaan ulang & jeda bertahap adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.
Mengapa percobaan ulang + penundaan bertahap
Tujuan: Membuat pemanggilan lebih tangguh.
- Coba lagi saat terjadi kegagalan sementara
- Gunakan penundaan eksponensial + variasi acak
- Tetapkan jumlah percobaan maksimum dan penundaan maksimum
- Berhenti saat terjadi kesalahan fatal atau pembatalan
Mengklasifikasikan kegagalan
Sementara: batas waktu, 429/5xx, gangguan jaringan sementara.
Fatal: permintaan buruk, tidak berwenang, kesalahan validasi—jangan coba lagi.
Aturan: hanya coba lagi hal yang mungkin berhasil nanti.
Pembantu penundaan bertahap
Pembantu kecil ini memperpanjang penundaan pada setiap percobaan dan menambahkan variasi acak kecil; batasi juga penundaan maksimumnya.
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");
}
}
}
Pembungkus percobaan ulang
Bungkus pemanggilan tersebut: coba lagi hanya saat terjadi pengecualian sementara; berhenti saat terjadi pengecualian lain. Setiap percobaan ulang menunggu lebih lama dengan variasi acak.
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);
}
}
}
Percobaan ulang berbatas anggaran
Tambahkan anggaran global melalui pembatalan: teruskan token ke operasi dan ke penundaan bertahap.
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); }
}
}
Panduan
Kiat:
- Coba lagi hanya pemanggilan idempoten.
- Gunakan batas maksimum untuk jumlah percobaan dan penundaan.
- Tambahkan variasi acak kecil untuk menghindari lonjakan permintaan serentak.
- Catat kegagalan akhir beserta alasannya dan jumlah percobaan.
Definisi penundaan bertahap
Ringkasan
Ringkasan: Coba lagi hanya kesalahan sementara, perbesar penundaan secara eksponensial dengan batas maksimum, tambahkan variasi acak, dan berhenti saat terjadi pembatalan atau kesalahan fatal.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Dasar-dasar ketahanan: percobaan ulang & jeda bertahap” gratis?
Ya — teks lengkap “Dasar-dasar ketahanan: percobaan ulang & jeda bertahap” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Dasar-dasar ketahanan: percobaan ulang & jeda bertahap”?
Implementasikan percobaan ulang sederhana dengan jeda eksponensial dan jitter; bedakan kesalahan sementara dan fatal; batasi jeda; hentikan saat dibatalkan. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.
Berapa lama pelajaran “Dasar-dasar ketahanan: percobaan ulang & jeda bertahap” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pola CancellationToken; pembatalan kooperatif
- Batas waktu, IProgress , disposable async (emulasi)
- Dasar-dasar ketahanan: percobaan ulang & jeda bertahap