Piirin katkaisija ja laipio
Oppikaa yhdistämään piirin katkaisijat laipiomalliin resurssihäiriöiden eristämiseksi ja ketjuuntuvien ongelmien estämiseksi.
Piirin katkaisija ja laipio on ilmainen Mikropalveluiden viestintämallit (Saga, Circuit Breaker)-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.
Mallit toimivat paremmin yhdessä
Resilienssimallit, kuten Circuit Breaker ja Bulkhead, ovat tehokkaita yksinäänkin. Monimutkaisissa mikropalveluissa niiden yhdistäminen tarjoaa kuitenkin vielä vahvemman suojan.
Ajatelkaa niitä sovelluksenne erilaisina suojakerroksina. Kukin kerros torjuu erityyppisiä uhkia, jolloin puolustuksesta muodostuu kestävämpi.
Circuit Breakerin kertaus
Muistatteko Circuit Breaker -mallin? Se toimii palvelukutsujen sähkökatkaisijan tavoin.
- Se valvoo palveluun tehtäviä kutsuja.
- Jos virheiden määrä ylittää raja-arvon, se "avaa" piirin.
- Kun piiri on avoin, uudet kutsut epäonnistuvat heti. Näin estetään vikaantuneen palvelun ylikuormittuminen ja säästetään resursseja.
- Katkaisun jälkeen piiri siirtyy "puoliavoimeen" tilaan testatakseen, onko palvelu palautunut.
Bulkhead-mallin kertaus
Bulkhead-malli eristää resurssit. Kuvitelkaa laiva, jossa on vesitiiviitä osastoja eli laipioita.
- Jos yksi osasto täyttyy vedellä, muut pysyvät turvassa.
- Mikropalveluissa tämä tarkoittaa resurssivarantojen (esimerkiksi säiealtaiden ja yhteyksien) erottamista eri palveluille.
- Yhden palvelun resurssivarannon vika ei kuluta loppuun muiden palvelujen tarvitsemia resursseja.
Yhteisvaikutus: CB + Bulkhead
Miksi käyttää molempia? Ne ratkaisevat eri ongelmia, mutta täydentävät toisiaan erinomaisesti.
- Circuit Breaker: Keskittyy pysäyttämään pyynnöt vikaantuneelle palvelulle.
- Bulkhead: Keskittyy resurssien eristämiseen ja estää resurssien loppumisesta johtuvat ketjuuntuvat virheet.
Yhdessä ne tarjoavat kattavan suojan erilaisia vikatilanteita vastaan.
Bulkhead auttaa Circuit Breakeria
Miten Bulkhead parantaa Circuit Breakeria?
Circuit Breakerin on havaittava virheet. Jos palvelu on ylikuormittunut (esimerkiksi resurssien loppumisen vuoksi) ja kaikki sille tehdyt kutsut alkavat epäonnistua hitaasti, Circuit Breakerin avautuminen voi kestää.
Eristämällä resurssit Bulkhead varmistaa, että virheellisesti toimiva palvelu kuluttaa vain rajallisen määrän resursseja. Näin estetään resurssien täydellinen loppuminen ja Circuit Breaker voi reagoida nopeammin ja hallitummin todellisiin palveluvirheisiin pelkän resurssipulan sijaan.
Circuit Breaker auttaa Bulkheadia
Miten Circuit Breaker puolestaan parantaa Bulkheadia?
Jos palvelun tiedetään olevan vikaantunut (Circuit Breaker on OPEN-tilassa), Circuit Breaker sieppaa pyynnöt ja hylkää ne heti ennen kuin ne edes yrittävät varata resurssia Bulkheadin altaasta.
Tällöin Bulkheadin rajallisia resursseja ei tuhlata kutsuihin, jotka joka tapauksessa epäonnistuisivat, vaan ne säilyvät muille mahdollisesti terveille toiminnoille tai palvelun palautumisen ajaksi.
Tosielämän esimerkki: säiealtaat
Yleinen tapa toteuttaa Bulkhead-malli on käyttää säiealtaita.
- Varatkaa tietylle ulkoiselle palvelulle oma, rajallinen säieallas.
- Jos palvelu on hidas tai ei vastaa, vain sen omat säikeet jäävät varatuiksi.
- Muut palvelut, joilla on omat säiealtaansa, eivät kärsi tilanteesta.
Yhdessä Circuit Breakerin kanssa CB pysäyttää kutsut ennen kuin ne edes siirtyvät säiealtaaseen, jos palvelu on poissa käytöstä.
Koodi: CB ja BH käytännössä
Tässä esimerkissä Circuit Breaker (CB) tarkistetaan ennen Bulkheadin (BH) resurssin varaamista. Jos CB on avoin, kutsu epäonnistuu heti ja BH:n resursseja säästyy.
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;
public class Main {
private static AtomicBoolean circuitOpen = new AtomicBoolean(false);
private static long lastFailureTime = 0;
private static final long RESET_TIMEOUT_MS = 5000;
private static final Semaphore serviceBulkhead = new Semaphore(2);
public static void callProtectedService(String callerId) {
// 1. Circuit Breaker check (Fail Fast)
if (circuitOpen.get()) {
if (System.currentTimeMillis() - lastFailureTime > RESET_TIMEOUT_MS) {
System.out.println(callerId + ": Circuit Half-Open. Testing service...");
circuitOpen.set(false); // Simple reset for demo
} else {
System.out.println(callerId + ": CB OPEN. REJECTED!");
return;
}
}
// 2. Bulkhead check (Resource Isolation)
boolean acquiredBulkhead = false;
try {
if (serviceBulkhead.tryAcquire()) {
acquiredBulkhead = true;
System.out.println(callerId + ": BH slot ACQUIRED. Calling...");
Thread.sleep(200); // Simulate work
if (callerId.equals("Call-3") || callerId.equals("Call-4")) {
System.out.println(callerId + ": Simulating FAILURE!");
circuitOpen.set(true);
lastFailureTime = System.currentTimeMillis();
} else {
System.out.println(callerId + ": Call SUCCESS.");
}
} else {
System.out.println(callerId + ": BH FULL. REJECTED!");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println(callerId + ": Call interrupted.");
} finally {
if (acquiredBulkhead) {
serviceBulkhead.release();
}
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("--- First calls (CB CLOSED) ---");
for (int i = 1; i <= 5; i++) {
final int callNum = i;
new Thread(() -> callProtectedService("Call-" + callNum)).start();
Thread.sleep(50);
}
Thread.sleep(1500);
System.out.println("\n--- Second calls (CB potentially OPEN) ---");
for (int i = 6; i <= 10; i++) {
final int callNum = i;
new Thread(() -> callProtectedService("Call-" + callNum)).start();
Thread.sleep(50);
}
Thread.sleep(6000);
System.out.println("\n--- Third calls (after reset) ---");
for (int i = 11; i <= 13; i++) {
final int callNum = i;
new Thread(() -> callProtectedService("Call-" + callNum)).start();
Thread.sleep(50);
}
}
}Yhdistämisen hyödyt
Circuit Breakerin ja Bulkheadin yhdessä käyttäminen tarjoaa seuraavat hyödyt:
- Tehokkaampi vikaeristys: Estää yhden vikaantuneen palvelun kaatamasta muita sekä pysäyttämällä kutsut että rajoittamalla resurssien käyttöä.
- Resurssien parempi hallinta: Käyttää käytettävissä olevia resursseja tehokkaasti ja hylkää kutsut ajoissa, jos palvelun tiedetään olevan toimintakyvytön.
- Nopeampi palautuminen: Antaa järjestelmän terveille osille mahdollisuuden jatkaa toimintaansa, mikä tukee koko järjestelmän vakautta ja palautumista.
- Ennakoitava toiminta: Auttaa säilyttämään vastausajat ja suorituskyvyn ennakoitavina kuormituksen aikana.
Pikatarkistus
Mitkä seuraavista väitteistä kuvaavat oikein Circuit Breaker- ja Bulkhead-mallien yhdistämisen hyötyjä?
Kertaus: yhdessä vahvempia
Tässä oppitunnissa tutustuimme Circuit Breaker- ja Bulkhead-mallien tehokkaaseen yhdistelmään.
- Näimme, miten Circuit Breaker estää kutsut vikaantuneille palveluille.
- Kertasimme, miten Bulkhead eristää resurssit.
- Mikä tärkeintä, opimme, miten ne vahvistavat toisiaan ja luovat vikasietoisen ja vakaan mikropalveluarkkitehtuurin.
Seuraavaksi näemme, miten Circuit Breakereita voidaan yhdistää Retry-logiikkaan entistä tehokkaampaa virheenkäsittelyä varten!
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 laipio” ilmainen?
Kyllä – oppitunnin ”Piirin katkaisija ja laipio” 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 laipio”?
Oppikaa yhdistämään piirin katkaisijat laipiomalliin resurssihäiriöiden eristämiseksi ja ketjuuntuvien ongelmien estämiseksi. 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 1/4.
Kuinka kauan ”Piirin katkaisija ja laipio”-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