0Pricing
JavaScript Academy · Lekcja

Wzorce ponawiania prób i backoff

Ponawianie nieudanych operacji asynchronicznych kilka razy z opóźnieniami; dodawanie wykładniczego backoff i niewielkiego jittera oraz kończenie po jasno określonej liczbie prób

Wzorce ponawiania prób i backoff to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 3 lekcji w sumie.

Po co ponawiać próby?

Cel: dodać niewielką liczbę kontrolowanych ponowień.

  • Prosta pętla ponawiania
  • Wykładnicze zwiększanie opóźnienia
  • Niewielki jitter
  • Jasno określona maksymalna liczba prób
Wzorce ponawiania prób i backoff — ilustracja 1

Pomocnicza funkcja opóźnienia

Potrzebna jest niewielka pomocnicza funkcja delay, aby wstrzymywać działanie między próbami.

// delay: resolve after ms
function delay(ms) {
  return new Promise(function (resolve) {
    setTimeout(function () { resolve(); }, ms);
  });
}

async function demoDelay() {
  console.log("wait...");
  await delay(5);
  console.log("done");
}

demoDelay();
Wzorce ponawiania prób i backoff — ilustracja 2

Symulowanie niestabilnego działania

To fikcyjne zadanie pozwala ćwiczyć ponawianie prób bez wykonywania rzeczywistych wywołań sieciowych.

// Unstable task: fails first N times, then succeeds
function makeUnstable(failCount, value) {
  let left = failCount;
  return async function run() {
    if (left > 0) {
      left = left - 1;
      throw new Error("temporary");
    }
    return value;
  };
}

const sometimes = makeUnstable(2, "OK");
sometimes().catch(function (e) { console.log("first:", e.message); });
Wzorce ponawiania prób i backoff — ilustracja 3

Stała pętla ponawiania

Stały odstęp: należy odczekać tyle samo między próbami i zakończyć działanie po osiągnięciu maksymalnej liczby prób.

// Retry a few times with a fixed wait
async function retryFixed(fn, tries, waitMs) {
  let lastError = null;
  for (let i = 1; i <= tries; i++) {
    try {
      return await fn();
    } catch (e) {
      lastError = e;
      console.log("attempt", i, "failed:", e.message);
      if (i < tries) {
        await delay(waitMs);
      }
    }
  }
  throw lastError;
}

(async function () {
  const job = makeUnstable(2, "OK");
  const result = await retryFixed(job, 3, 5);
  console.log("fixed result:", result);
})();
Wzorce ponawiania prób i backoff — ilustracja 4

Wykładnicze zwiększanie opóźnienia

Backoff: przy każdej próbie należy zwiększać czas oczekiwania i dodać niewielki jitter, aby uniknąć nagłych skoków obciążenia.

// Exponential backoff with a tiny jitter
function jitter(ms) {
  const wiggle = Math.floor(Math.random() * 3); // 0..2
  return ms + wiggle;
}

async function retryBackoff(fn, tries, baseMs) {
  let lastError = null;
  for (let i = 1; i <= tries; i++) {
    try {
      return await fn();
    } catch (e) {
      lastError = e;
      console.log("attempt", i, "failed:", e.message);
      if (i < tries) {
        const wait = jitter(baseMs * Math.pow(2, i - 1));
        await delay(wait);
      }
    }
  }
  throw lastError;
}

(async function () {
  const job = makeUnstable(2, "OK");
  const value = await retryBackoff(job, 4, 3);
  console.log("backoff result:", value);
})();
Wzorce ponawiania prób i backoff — ilustracja 5

Wskazówki dotyczące ponawiania prób

Wskazówki:

  • Próby należy ponawiać tylko w przypadku tymczasowych błędów, takich jak przekroczenie limitu czasu lub limitu żądań.
  • Nie należy ponawiać prób w przypadku nieprawidłowych danych wejściowych.
  • Liczba prób powinna być niewielka (3–5), a błędy należy krótko rejestrować.
Wzorce ponawiania prób i backoff — ilustracja 6

Quiz z ponawiania prób i backoff

Szybkie sprawdzenie: podstawy backoff.

Wzorce ponawiania prób i backoff — ilustracja 7

Podsumowanie

Podsumowanie: utworzono stałą pętlę ponawiania prób, dodano wykładnicze zwiększanie opóźnienia z niewielkim jitterem oraz ustawiono maksymalną liczbę prób, aby aplikacje zachowywały płynność działania.

Wzorce ponawiania prób i backoff — ilustracja 8

Często zadawane pytania

Czy lekcja „Wzorce ponawiania prób i backoff” jest bezpłatna?

Tak — pełny tekst „Wzorce ponawiania prób i backoff” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Wzorce ponawiania prób i backoff”?

Ponawianie nieudanych operacji asynchronicznych kilka razy z opóźnieniami; dodawanie wykładniczego backoff i niewielkiego jittera oraz kończenie po jasno określonej liczbie prób Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?

Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „Wzorce ponawiania prób i backoff”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?

Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pisanie funkcji async; try/catch; równolegle a sekwencyjnie
  2. Limity czasu i przerywanie za pomocą AbortController
  3. Wzorce ponawiania prób i backoff
← Powrót do JavaScript Academy