Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker) · Lektion

Grundlæggende om retry-mønstret

Lær det grundlæggende i retry-mønstret for automatisk at gentage mislykkede operationer og gøre systemet mere robust.

Lektion 2 af 412 trin

Grundlæggende om retry-mønstret er en gratis Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker), og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-kurset indeholder 4 lektioner i alt.

Oplever du midlertidige problemer

Forestil dig, at du prøver at sende en besked, men din internetforbindelse blinker væk i et sekund. Hvad gør du?

Du prøver sandsynligvis igen! Denne enkle menneskelige adfærd er den grundlæggende idé bag genforsøgsmønstret i software.

Hvad er genforsøgsmønstret

Genforsøgsmønstret er en grundlæggende robusthedsteknik. Det indebærer, at en handling, der er mislykkedes, automatisk forsøges igen.

Det bruges, når vi forventer, at fejlen er midlertidig, hvilket betyder, at den sandsynligvis løser sig selv snart, f.eks. ved en kortvarig netværksafbrydelse eller en midlertidig databaselås.

Hvorfor bruge genforsøg

I distribuerede systemer er tjenester ofte afhængige af hinanden. Fejl kan opstå af mange årsager:

  • Netværksproblemer: En kortvarig afbrydelse eller høj latenstid.
  • Ressourcekonkurrence: En database eller tjeneste er midlertidigt overbelastet.
  • Genstart af tjenester: En afhængig tjeneste er kortvarigt utilgængelig under en opdatering.

Genforsøg hjælper din applikation med at komme sig på en graciøs måde efter disse forstyrrelser uden at gå ned eller kræve manuel indgriben.

Den grundlæggende genforsøgsløkke

I sin enkleste form fungerer genforsøgsmønstret sådan:

  1. Forsøg at udføre en handling.
  2. Hvis den mislykkes, skal du kontrollere, om det er en fejl, der kan forsøges igen.
  3. Hvis den kan forsøges igen, skal du øge en tæller og prøve igen.
  4. Stop efter et bestemt antal forsøg, eller hvis handlingen lykkes.

Lad os se et grundlæggende eksempel uden forsinkelser endnu.

Kode: Enkel genforsøgslogik

Denne kode simulerer en handling, der mislykkes to gange, før den lykkes. Bemærk, hvordan while-løkken bliver ved med at prøve, indtil handlingen lykkes, eller der ikke er flere forsøg.

public class Main {
  public static void main(String[] args) {
    boolean success = false;
    int maxAttempts = 3;
    int currentAttempt = 0;

    while (!success && currentAttempt < maxAttempts) {
      currentAttempt++;
      System.out.println("Attempt " + currentAttempt + ": Trying to connect...");
      // Simulate failure for first two attempts
      if (currentAttempt < 3) {
        System.out.println("Connection failed!");
      } else {
        System.out.println("Connection successful!");
        success = true;
      }
    }

    if (!success) {
      System.out.println("Failed after " + maxAttempts + " attempts.");
    }
  }
}

Tilføjelse af en forsinkelse: Fast genforsøg

Hvis du blot forsøger igen med det samme, kan du overbelaste en presset tjeneste eller fejle igen, hvis problemet har brug for tid til at løse sig. Derfor tilføjer vi forsinkelser.

Et genforsøg med fast forsinkelse venter den samme tid mellem hvert mislykkede forsøg. Det giver systemet mulighed for at komme sig.

Kode: Genforsøg med fast forsinkelse

Her har vi tilføjet en forsinkelse på 1 sekund (1000ms) ved hjælp af Thread.sleep() efter hvert mislykket forsøg. Det er en almindelig praksis, som giver systemet lidt luft.

public class Main {
  public static void main(String[] args) {
    boolean success = false;
    int maxAttempts = 3;
    int currentAttempt = 0;
    long delayMillis = 1000; // 1 second delay

    while (!success && currentAttempt < maxAttempts) {
      currentAttempt++;
      System.out.println("Attempt " + currentAttempt + ": Trying to connect...");
      // Simulate failure for first two attempts
      if (currentAttempt < 3) {
        System.out.println("Connection failed!");
        try {
          Thread.sleep(delayMillis); // Wait before retrying
          System.out.println("Waiting " + delayMillis + "ms...");
        } catch (InterruptedException e) {
          Thread.currentThread().interrupt();
        }
      } else {
        System.out.println("Connection successful!");
        success = true;
      }
    }

    if (!success) {
      System.out.println("Failed after " + maxAttempts + " attempts.");
    }
  }
}

Smartere ventetider: Eksponentiel ventetid

Selvom faste forsinkelser fungerer, er det nogle gange bedre at øge ventetiden ved hvert efterfølgende genforsøg. Det kaldes eksponentiel ventetid.

Du kan f.eks. vente 1 sekund, derefter 2 sekunder, så 4 sekunder og til sidst 8 sekunder. Det mindsker belastningen på en presset tjeneste og giver den mere tid til at komme sig.

Hvornår skal du bruge genforsøgsmønstret

Gentagne forsøg er mest effektive ved:

  • Midlertidige netværksfejl: Korte afbrydelser og tidsudløb.
  • Midlertidig utilgængelighed af ressourcer: En forbindelsespool til en database er kortvarigt opbrugt.
  • Optimistiske samtidighedskonflikter: Når flere brugere forsøger at opdatere den samme post på samme tid.
  • Korte genstarter af tjenester: En mikrotjeneste er ved at blive implementeret igen.

Hvornår skal du IKKE bruge gentagne forsøg

Gentagne forsøg er ikke en universalløsning. Undgå at bruge dem ved:

  • Ikke-midlertidige fejl: Fejl, der skyldes ugyldigt input, godkendelsesfejl eller manglende ressourcer, og som ikke løser sig selv.
  • Ikke-idempotente operationer: Hvis gentagelse af en operation har utilsigtede bivirkninger, f.eks. at opkræve en kunde to gange. Idempotens betyder, at en operation kan udføres flere gange uden at ændre resultatet ud over den første udførelse.
  • Langvarige fejl: Hvis en tjeneste er permanent nede eller ramt af et større driftsnedbrud.

Test din viden!

Hvilket scenarie er generelt velegnet til at anvende Retry Pattern?

Opsummering af Retry Pattern

Du har lært det grundlæggende i Retry Pattern!

  • Det bruges til automatisk at forsøge mislykkede operationer igen.
  • Det er afgørende til håndtering af midlertidige fejl i distribuerede systemer.
  • En grundlæggende implementering består af en løkke med et maksimalt antal forsøg.
  • Tilføjelse af forsinkelser (faste eller eksponentielt stigende) er vigtig for at give systemer tid til at komme sig.
  • Du skal vide, hvornår det skal bruges, f.eks. ved netværksproblemer, og hvornår det skal undgås, f.eks. ved ikke-midlertidige fejl og ikke-idempotente operationer.

Dernæst undersøger vi andre modstandsdygtighedsmønstre som reserveplaner og tidsgrænser!

Gratis at komme i gang

Lær Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker) med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Grundlæggende om retry-mønstret” gratis?

Ja — hele teksten til “Grundlæggende om retry-mønstret” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-kurset, skal du opgradere til CoddyKit PRO. Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Grundlæggende om retry-mønstret”?

Lær det grundlæggende i retry-mønstret for automatisk at gentage mislykkede operationer og gøre systemet mere robust. Du øver dig i Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker) med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)?

Der kræves ingen tidligere erfaring. Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker) på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Grundlæggende om retry-mønstret”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-lektion?

Ja. Alle Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor resiliens er vigtig
  2. Grundlæggende om retry-mønstret
  3. Implementering af fallbacks og timeouts
  4. Bulkhead-mønsteret
← Tilbage til Kommunikationsmønstre i mikrotjenester (Saga, Circuit Breaker)