Piirin katkaisija ja uudelleenyrityslogiikka
Ymmärtäkää piirin katkaisijoiden ja uudelleenyritysmekanismien yhteistoiminta optimaalista virheenkäsittelyä ja palautumista varten.
Piirin katkaisija ja uudelleenyrityslogiikka on ilmainen Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. 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 Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-kurssilla on yhteensä 4 oppituntia.
Circuit Breakerin ja Retrayn yhdistäminen
Hajautetuissa järjestelmissä virheet ovat väistämättömiä. Olemme tutustuneet Retry-malliin tilapäisten ongelmien käsittelyssä ja Circuit Breakeriin jatkuvien ongelmien käsittelyssä.
Mutta miten nämä tehokkaat mallit toimivat yhdessä? Niiden tehokas yhdistäminen on avain todella vikasietoisten mikropalvelujen rakentamiseen.
Kertaus: Retry-malli
Retry-malli yrittää automaattisesti uudelleen toimintoa, joka on epäonnistunut tilapäisen häiriön vuoksi.
- Käyttötapaus: Verkkohäiriöt, palvelun tilapäinen saavuttamattomuus, tietokannan umpikujat.
- Tavoite: Selvitä hetkellisistä häiriöistä ilman käyttäjän toimia.
- Toimintaperiaate: Yleensä uudelleenyritysten välillä on viive, esimerkiksi eksponentiaalinen backoff.
Kertaus: Circuit Breaker
Circuit Breaker estää sovellusta kutsumasta toistuvasti palvelua, jonka toiminta todennäköisesti epäonnistuu. Se "laukeaa" ja katkaisee kutsut, kun virheitä ilmenee liikaa.
- Käyttötapaus: Palvelu on poissa käytöstä, ylikuormittunut tai palauttaa jatkuvasti virheitä.
- Tavoite: Epäonnistu nopeasti, estä ketjuuntuvat virheet ja anna vikaantuneelle palvelulle aikaa palautua.
- Tilat: Suljettu, avoin, puoliksi avoin.
Synergia: CB ja Retry
Kuvitellaan palvelu, jossa ilmenee lyhyt verkkohäiriö. Retry voi käsitellä tilanteen hallitusti. Mutta mitä tapahtuu, jos palvelu on kokonaan poissa käytöstä pitkän aikaa?
Ilman Circuit Breakeria uudelleenyritykset kuormittaisivat jatkuvasti vastaamatonta palvelua, kuluttaisivat resursseja ja pitkittäisivät ongelmaa. Tässä niiden yhdistelmän voima tulee esiin!
Toimintojen suoritusjärjestys
Kun näitä malleja yhdistetään, on ratkaistava tärkeä suunnittelukysymys: kumpi ympäröi toisen?
Ympäröikö Retry-malli Circuit Breakerin vai ympäröikö Circuit Breaker Retry-mallin?
Järjestys vaikuttaa merkittävästi siihen, miten järjestelmäsi reagoi erityyppisiin virheisiin.
Retry ympäröi Circuit Breakerin
Jos Retry-malli ympäröi Circuit Breakeria:
- Retry yrittää suorittaa toiminnon.
- Circuit Breaker on mukana käsittelyssä.
- Jos CB avautuu, ensimmäinen yritys epäonnistuu ja Retry saattaa yrittää uudelleen osuen jo avoinna olevaan CB:hen.
- Tällöin uudelleenyritykset saattavat osua nopeasti epäonnistuvaan CB:hen, jolloin CB ei aluksi pääse suojaamaan järjestelmää täydellisesti.
Tämä kokoonpano on yleensä tehottomampi.
Circuit Breaker ympäröi Retryn
Jos Circuit Breaker ympäröi Retry-mallin:
- Circuit Breaker valvoo koko uudelleenyritysoperaatiota.
- Jos ensimmäinen kutsu epäonnistuu, Retry yrittää uudelleen.
- Vasta kun kaikki uudelleenyritykset epäonnistuvat määritettyjen yritysten aikana, Circuit Breaker laskee tilanteen yhdeksi epäonnistumiseksi.
- Jos tällaisia "kaikki uudelleenyritykset epäonnistuivat" -tilanteita ilmenee riittävästi, CB avautuu.
Tätä lähestymistapaa suositellaan.
CB suojaamassa Retry-logiikkaa
Tässä on käsitteellinen Java-esimerkki siitä, miten Circuit Breaker ympäröisi uudelleenyrityslogiikkaa sisältävän toiminnon. Huomaa, että Circuit Breakerin päätös avautua tai sulkeutua perustuu uudelleen yritetyn kutsun lopputulokseen.
Kokeile suorittaa tämä esimerkki:
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(); }
}
}
}Miksi tämä järjestys on paras
Circuit Breakerin sijoittaminen Retry-mallin ympärille tarjoaa useita etuja:
- Tehokas virheiden havaitseminen: CB avautuu vasta useiden todella epäonnistuneiden toimintojen jälkeen eli kun kaikki uudelleenyritykset ovat epäonnistuneet. Näin tilapäiset ongelmat voidaan erottaa jatkuvista käyttökatkoista.
- Kuormituksen vähentäminen: Kun CB on avoinna, se estää kaikki uudet uudelleenyritykset ja suojaa taustapalvelua ylikuormitukselta pitkittyneen vian aikana.
- Nopeammat epäonnistumiset: Kun palvelu on todella poissa käytöstä, CB avautuu nopeasti. Sovellus voi tällöin epäonnistua nopeasti sen sijaan, että se odottaisi kaikkien uudelleenyritysten päättymistä.
Testaa ymmärryksesi
Tarkastellaan mikropalvelua, jossa esiintyy ajoittaisia verkkohäiriöitä eli tilapäisiä virheitä ja joka on toisinaan kokonaan poissa käytöstä huollon vuoksi eli jatkuvan vian takia.
Toteutat sekä Retry-mallin että Circuit Breaker -mallin näiden tilanteiden käsittelemiseksi. Kumpaa kokoonpanoa yleensä suositellaan parhaan vikasietoisuuden saavuttamiseksi?
Oppitunnin yhteenveto
Olemme tarkastelleet Circuit Breakerin ja Retry-mallien tehokasta synergiaa. Vaikka molemmat parantavat vikasietoisuutta, niiden yhteinen tehokkuus riippuu siitä, miten ne toimivat yhdessä.
Muista, että suositeltu käytäntö on sijoittaa Circuit Breaker Retry-mallin ympärille. Tällöin uudelleenyritykset käsittelevät tilapäisiä vikoja, kun taas Circuit Breaker suojaa jatkuvilta vioilta, estää ketjuuntuvia ongelmia ja parantaa koko järjestelmän vakautta.
Jatka vankkojen järjestelmien rakentamista!
Opi Mikropalveluiden viestintämallit (Saga, Circuit Breaker) 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
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Piirin katkaisija ja uudelleenyrityslogiikka” ilmainen?
Kyllä – oppitunnin ”Piirin katkaisija ja uudelleenyrityslogiikka” 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 Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-kurssin, päivitä CoddyKit PROhon. Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Piirin katkaisija ja uudelleenyrityslogiikka”?
Ymmärtäkää piirin katkaisijoiden ja uudelleenyritysmekanismien yhteistoiminta optimaalista virheenkäsittelyä ja palautumista varten. Harjoittelet Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Piirin katkaisija ja uudelleenyrityslogiikka”-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ä Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-oppitunnilla?
Kyllä. Jokainen Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-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
- Piirin katkaisija ja laipio
- Piirin katkaisija ja uudelleenyrityslogiikka
- Nopeusrajoituksen integrointi
- Resilienssidekoraattoreiden järjestys