Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) · Lektion

Circuit breaker med återförsökslogik

Förstå samspelet mellan circuit breakers och återförsöksmekanismer för optimal felhantering och återhämtning.

Lektion 2 av 411 steg

Circuit breaker med återförsökslogik är en gratis lektion i Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker), och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) innehåller totalt 4 lektioner.

Kombinera Circuit Breaker och Retry

I distribuerade system är fel oundvikliga. Vi har lärt oss om Retry-mönstret för tillfälliga problem och Circuit Breaker för varaktiga problem.

Men hur fungerar dessa kraftfulla mönster tillsammans? Att kombinera dem effektivt är avgörande för att bygga verkligt motståndskraftiga mikrotjänster.

Sammanfattning: Retry-mönstret

Retry Pattern försöker automatiskt utföra en operation igen när den har misslyckats på grund av ett tillfälligt övergående fel.

  • Användningsområde: Nätverksproblem, tillfälligt otillgängliga tjänster och databasdeadlock.
  • Mål: Hantera kortvariga störningar utan att användaren behöver ingripa.
  • Mekanism: Innebär vanligtvis en fördröjning mellan försöken, till exempel exponentiell backoff.

Sammanfattning: Circuit Breaker

En Circuit Breaker förhindrar att ett program upprepade gånger anropar en tjänst som sannolikt kommer att misslyckas. Den "löser ut" kretsen och stoppar anropen när för många fel inträffar.

  • Användningsområde: Tjänsten ligger nere, är överbelastad eller returnerar konsekvent fel.
  • Mål: Misslyckas snabbt, förhindra kaskadfel och ge den felande tjänsten tid att återhämta sig.
  • Tillstånd: Closed, Open och Half-Open.

Synergi: CB och Retry

Föreställ dig att en tjänst drabbas av en kortvarig nätverksstörning. Retry kan hantera detta på ett smidigt sätt. Men vad händer om tjänsten är helt offline under en längre tid?

Utan en Circuit Breaker skulle nya försök fortsätta att belasta den icke-svarande tjänsten, slösa resurser och förlänga problemet. Det är här deras kombinerade styrka verkligen märks!

Anropsordning

När du kombinerar dessa mönster är en viktig designfråga: vilket mönster ska omsluta det andra?

Ska Retry Pattern omsluta Circuit Breaker, eller ska Circuit Breaker omsluta Retry Pattern?

Ordningen påverkar i hög grad hur systemet reagerar på olika typer av fel.

Retry omsluter Circuit Breaker

Om Retry Pattern omsluter Circuit Breaker:

  • Retry försöker utföra operationen.
  • Circuit Breaker aktiveras.
  • Om CB öppnas misslyckas det första försöket, och Retry kan försöka igen genom att anropa den redan öppna CB:n.
  • Detta kan leda till att försöken träffar en CB som misslyckas snabbt, vilket innebär att CB:n inte får möjlighet att fullt ut skydda systemet från början.

Den här uppsättningen är i allmänhet mindre effektiv.

Circuit Breaker omsluter Retry

Om Circuit Breaker omsluter Retry Pattern:

  • Circuit Breaker övervakar hela retry-operationen.
  • Om det första anropet misslyckas försöker Retry igen.
  • Först när alla försök har misslyckats inom det konfigurerade antalet försök räknar Circuit Breaker detta som ett enda fel.
  • Om tillräckligt många sådana försök där alla retry-försök misslyckats inträffar öppnas CB.

Detta är det rekommenderade tillvägagångssättet.

CB skyddar retry-logiken

Här är ett konceptuellt Java-exempel som visar hur en Circuit Breaker omsluter en operation som innehåller retry-logik. Observera att Circuit Breakers beslut att öppna eller stänga baseras på det slutliga resultatet av det återförsökta anropet.

Prova att köra exemplet:

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    // Simulate a dependency that sometimes fails
    private static AtomicInteger serviceCallCount = new AtomicInteger(0);

    public static boolean unreliableServiceCall() {
        System.out.println("  Attempting service call...");
        int currentCount = serviceCallCount.incrementAndGet();
        if (currentCount % 3 == 0) { // Fails every 3rd call
            System.out.println("  Service call FAILED temporarily.");
            return false;
        }
        System.out.println("  Service call SUCCESS.");
        return true;
    }

    public static boolean executeWithRetry() {
        int maxRetries = 2;
        long delayMillis = 100;
        for (int i = 0; i <= maxRetries; i++) {
            try {
                if (unreliableServiceCall()) {
                    return true; // Success after retry
                }
            } catch (Exception e) {
                // Log exception, continue retry
            }
            if (i < maxRetries) {
                System.out.println("  Retrying in " + delayMillis + "ms...");
                try { Thread.sleep(delayMillis); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
            }
        }
        return false; // All retries failed
    }

    // Conceptual Circuit Breaker logic for demonstration
    private static boolean circuitOpen = false;
    private static int failureCount = 0;
    private static final int FAILURE_THRESHOLD = 2; // Open after 2 consecutive failures
    private static final long RESET_TIMEOUT_MILLIS = 500; // Try to close after 0.5s
    private static long lastFailureTime = 0;

    public static boolean executeWithCircuitBreakerAndRetry() {
        if (circuitOpen) {
            if (System.currentTimeMillis() - lastFailureTime > RESET_TIMEOUT_MILLIS) {
                System.out.println("Circuit Breaker: Attempting HALF-OPEN state...");
                circuitOpen = false; // Move to half-open (for demo, just close)
                failureCount = 0; // Reset count
            } else {
                System.out.println("Circuit Breaker: OPEN! Failing fast.");
                return false; // Fail fast if open
            }
        }

        boolean success = executeWithRetry(); // Execute the retry logic

        if (!success) {
            failureCount++;
            lastFailureTime = System.currentTimeMillis();
            if (failureCount >= FAILURE_THRESHOLD) {
                circuitOpen = true;
                System.out.println("Circuit Breaker: OPENED due to repeated failures!");
            } else {
                System.out.println("Circuit Breaker: Failure detected, count=" + failureCount);
            }
        } else {
            failureCount = 0; // Reset failure count on success
            System.out.println("Circuit Breaker: Success, failure count reset.");
        }
        return success;
    }

    public static void main(String[] args) {
        System.out.println("--- Scenario: CB wrapping Retry ---");
        for (int i = 0; i < 7; i++) { // Simulate multiple requests
            System.out.println("\nRequest " + (i + 1) + ":");
            boolean overallSuccess = executeWithCircuitBreakerAndRetry();
            System.out.println("Overall result for Request " + (i + 1) + ": " + (overallSuccess ? "SUCCESS" : "FAILURE"));
            try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        }
    }
}

Varför den här ordningen är bäst

Att placera Circuit Breaker runt Retry Pattern har flera fördelar:

  • Effektiv feldetektering: CB öppnas först efter en serie verkligt misslyckade operationer, det vill säga när alla försök har misslyckats. På så sätt skiljs övergående problem från långvariga avbrott.
  • Minskad belastning: När CB är öppen förhindrar den alla ytterligare retry-försök och skyddar den bakomliggande tjänsten från att överbelastas under ett långvarigt fel.
  • Snabbare fel: När tjänsten verkligen ligger nere öppnas CB snabbt, så att programmet kan misslyckas direkt i stället för att vänta tills alla försök har förbrukats.

Kontrollera dina kunskaper

Tänk på en mikrotjänst som drabbas av tillfälliga nätverksproblem (övergående fel) och ibland går helt offline för underhåll (bestående fel).

Du implementerar både Retry Pattern och Circuit Breaker Pattern för att hantera dessa situationer. Vilken uppsättning rekommenderas i allmänhet för bästa motståndskraft?

Lektionssammanfattning

Vi har utforskat den kraftfulla synergin mellan Circuit Breaker och Retry Patterns. Även om båda förbättrar motståndskraften beror deras samlade effektivitet på hur de samverkar.

Kom ihåg att bästa praxis är att låta Circuit Breaker omsluta Retry Pattern. Då kan retry-försök hantera övergående fel, medan Circuit Breaker skyddar mot bestående fel, förhindrar kaskadproblem och förbättrar systemets övergripande stabilitet.

Fortsätt bygga robusta system!

Gratis att börja

Lär dig Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
12
Lektioner
48

Vanliga frågor

Är lektionen ”Circuit breaker med återförsökslogik” gratis?

Ja – hela texten till ”Circuit breaker med återförsökslogik” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker), kan Ni uppgradera till CoddyKit PRO. Kursen i Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) innehåller totalt 4 lektioner.

Vad lär jag mig i ”Circuit breaker med återförsökslogik”?

Förstå samspelet mellan circuit breakers och återförsöksmekanismer för optimal felhantering och återhämtning. Ni övar på Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker)?

Du behöver inga förkunskaper. Utbildningen i Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker) på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Circuit breaker med återförsökslogik”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker)-lektionen?

Ja. Varje Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker)-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Circuit breaker och bulkhead
  2. Circuit breaker med återförsökslogik
  3. Integrera hastighetsbegränsning
  4. Ordningen på resiliens-dekoratörer
← Tillbaka till Kommunikationsmönster för mikrotjänster (Saga, Circuit Breaker)