C# Academy · Oppitunti

Vikasietoisuuden perusteet: uudelleenyritys ja backoff

Toteuttakaa yksinkertaisia uudelleenyrityksiä eksponentiaalisella backoffilla ja jitterillä, erottakaa ohimenevät ja vakavat virheet, rajoittakaa viiveitä ja lopettakaa peruutuksen yhteydessä.

Oppitunti 3/38 vaihetta

Vikasietoisuuden perusteet: uudelleenyritys ja backoff on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 3 oppituntia.

Miksi uudelleenyritys ja backoff

Tavoite: Tee kutsuista vikasietoisia.

  • Yritä tilapäisten virheiden jälkeen uudelleen
  • Käytä eksponentiaalista backoffia ja jitteriä
  • Aseta yrityskertojen enimmäismäärä ja enimmäisviive
  • Lopeta vakavien virheiden tai peruutuksen yhteydessä

Virheiden luokittelu

Tilapäiset: aikakatkaisut, 429/5xx-virheet ja tilapäiset verkkohäiriöt.

Vakavat: virheellinen pyyntö, luvattomuus ja validointivirheet – älä yritä uudelleen.

Sääntö: yritä uudelleen vain silloin, kun toiminto voi onnistua myöhemmin.

Backoff-apufunktio

Pieni apufunktio kasvattaa viivettä jokaisella yrityskerralla ja lisää hieman jitteriä; rajoita samalla enimmäisviivettä.

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");
    }
  }
}

Uudelleenyrityksen kääre

Kääri kutsu: yritä uudelleen vain tilapäisten poikkeusten yhteydessä ja lopeta muiden poikkeusten kohdalla. Jokainen uudelleenyritys odottaa hieman pidempään jitterin ansiosta.

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);
    }
  }
}

Budjetoidut uudelleenyritykset

Lisää peruutuksen avulla globaali aikabudjetti: välitä tunnukset sekä operaatioon että backoff-viiveisiin.

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); }
  }
}

Ohjeet

Vinkit:

  • Yritä uudelleen vain idempotentteja kutsuja.
  • Aseta ylärajat yrityskerroille ja viiveelle.
  • Lisää hieman jitteriä välttääksesi palvelun yhtäaikaisen kuormittumisen.
  • Kirjaa lopullinen virhe sekä sen syy ja yrityskertojen määrä.

Backoffin määritelmä

Pikakysymys: Mikä kuvaa parhaiten eksponentiaalista backoffia jitterin kanssa?

Kertaus

Kertaus: Yritä uudelleen vain tilapäisten virheiden jälkeen, kasvata viiveitä eksponentiaalisesti ja aseta niille yläraja, lisää jitteriä ja lopeta peruutuksen tai vakavien virheiden yhteydessä.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”Vikasietoisuuden perusteet: uudelleenyritys ja backoff” ilmainen?

Kyllä – oppitunnin ”Vikasietoisuuden perusteet: uudelleenyritys ja backoff” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Vikasietoisuuden perusteet: uudelleenyritys ja backoff”?

Toteuttakaa yksinkertaisia uudelleenyrityksiä eksponentiaalisella backoffilla ja jitterillä, erottakaa ohimenevät ja vakavat virheet, rajoittakaa viiveitä ja lopettakaa peruutuksen yhteydessä. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/3.

Kuinka kauan ”Vikasietoisuuden perusteet: uudelleenyritys ja backoff”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. CancellationToken-mallit ja yhteistyöhön perustuva peruutus
  2. Aikakatkaisut, IProgress ja asynkroniset vapautettavat resurssit (jäljitelmä)
  3. Vikasietoisuuden perusteet: uudelleenyritys ja backoff
← Takaisin: C# Academy