Hrvatski

Istražite obrazac prekidača strujnog kruga (Circuit Breaker) za toleranciju grešaka, poboljšavajući otpornost i stabilnost aplikacija. Saznajte o njegovoj implementaciji, prednostima i primjerima iz stvarnog svijeta.

Prekidač strujnog kruga (Circuit Breaker): Robustan obrazac za toleranciju grešaka u modernim aplikacijama

U svijetu razvoja softvera, posebno unutar arhitektura mikroservisa i distribuiranih sustava, osiguravanje otpornosti aplikacija je od presudne važnosti. Kada komponente zakažu, ključno je spriječiti kaskadne kvarove i održati stabilno korisničko iskustvo s brzim odzivom. Obrazac prekidača strujnog kruga (Circuit Breaker) pojavljuje se kao moćno rješenje za postizanje tolerancije grešaka i elegantne degradacije u takvim scenarijima.

Što je obrazac prekidača strujnog kruga?

Obrazac prekidača strujnog kruga inspiriran je električnim prekidačem koji štiti strujne krugove od oštećenja uzrokovanih prekomjernom strujom. U softveru, djeluje kao posrednik (proxy) za operacije koje bi mogle zakazati, sprječavajući aplikaciju da neprestano pokušava izvršiti operaciju koja će vjerojatno zakazati. Ovaj proaktivni pristup izbjegava rasipanje resursa, smanjuje latenciju i u konačnici poboljšava stabilnost sustava.

Osnovna ideja je da kada servis dosljedno ne uspijeva odgovoriti, prekidač se "otvara", sprječavajući daljnje zahtjeve prema tom servisu. Nakon definiranog razdoblja, prekidač ulazi u "poluotvoreno" stanje, dopuštajući ograničenom broju testnih zahtjeva da prođu. Ako ti zahtjevi uspiju, prekidač se "zatvara", nastavljajući normalan rad. Ako ne uspiju, prekidač ostaje otvoren i ciklus se ponavlja.

Stanja prekidača strujnog kruga

Prekidač strujnog kruga radi u tri različita stanja:

Prednosti korištenja obrasca prekidača strujnog kruga

Implementacija obrasca prekidača strujnog kruga pruža nekoliko ključnih prednosti:

Razmatranja pri implementaciji

Učinkovita implementacija obrasca prekidača strujnog kruga zahtijeva pažljivo razmatranje nekoliko faktora:

Primjeri implementacije

Obrazac prekidača strujnog kruga može se implementirati koristeći različite programske jezike i okvire. Evo nekoliko primjera:

Java s Resilience4j

Resilience4j je popularna Java biblioteka koja pruža sveobuhvatan set alata za toleranciju grešaka, uključujući Circuit Breaker, Retry, Rate Limiter i Bulkhead. Evo osnovnog primjera:


CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofMillis(1000))
    .permittedNumberOfCallsInHalfOpenState(2)
    .slidingWindowSize(10)
    .build();

CircuitBreaker circuitBreaker = CircuitBreaker.of("myService", circuitBreakerConfig);

Supplier<String> decoratedSupplier = CircuitBreaker
    .decorateSupplier(circuitBreaker, () -> myRemoteService.getData());

try {
    String result = decoratedSupplier.get();
    // Obradi rezultat
} catch (RequestNotPermitted e) {
    // Obrada otvorenog kruga
    System.err.println("Strujni krug je otvoren: " + e.getMessage());
}

Python s Pybreaker

Pybreaker je Python biblioteka koja pruža jednostavnu i laku za korištenje implementaciju prekidača strujnog kruga.


import pybreaker

breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=10)

@breaker
def unreliable_function():
    # Ovdje ide poziv vaše nepouzdane funkcije
    pass

try:
    unreliable_function()
except pybreaker.CircuitBreakerError:
    print("Prekidač strujnog kruga je otvoren!")

.NET s Polly

Polly je .NET biblioteka za otpornost i rukovanje prolaznim greškama koja omogućuje programerima da izraze politike kao što su Retry, Circuit Breaker, Timeout i Bulkhead na fluentan i kompozitan način.


var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(
        exceptionsAllowedBeforeBreaking: 3,
        durationOfBreak: TimeSpan.FromSeconds(10),
        onBreak: (exception, timespan) =>
        {
            Console.WriteLine("Prekidač strujnog kruga otvoren: " + exception.Message);
        },
        onReset: () =>
        {
            Console.WriteLine("Prekidač strujnog kruga resetiran.");
        },
        onHalfOpen: () =>
        {
            Console.WriteLine("Prekidač strujnog kruga poluotvoren.");
        });


try
{
    await circuitBreakerPolicy.ExecuteAsync(async () =>
    {
        // Vaša nepouzdana operacija ovdje
        await MyRemoteService.GetDataAsync();
    });
}
catch (Exception ex)
{
    Console.WriteLine("Obrađena iznimka: " + ex.Message);
}

Primjeri iz stvarnog svijeta

Obrazac prekidača strujnog kruga široko se koristi u različitim industrijama i aplikacijama:

Prekidač strujnog kruga vs. obrazac ponovnog pokušaja (Retry)

Iako se i obrazac prekidača strujnog kruga i obrazac ponovnog pokušaja koriste za toleranciju grešaka, služe različitim svrhama.

U nekim slučajevima, ovi se obrasci mogu koristiti zajedno. Na primjer, možete implementirati obrazac ponovnog pokušaja unutar prekidača strujnog kruga. Prekidač bi spriječio prekomjerne ponovne pokušaje ako servis dosljedno ne uspijeva, dok bi se obrazac ponovnog pokušaja bavio prolaznim greškama prije nego što se prekidač aktivira.

Antiobrasci koje treba izbjegavati

Iako je prekidač strujnog kruga moćan alat, važno je biti svjestan potencijalnih antiobrazaca:

Napredni koncepti

Zaključak

Obrazac prekidača strujnog kruga ključan je alat za izgradnju otpornih i na greške tolerantnih aplikacija, posebno u arhitekturama mikroservisa i distribuiranim sustavima. Sprječavanjem kaskadnih kvarova, smanjenjem latencije i omogućavanjem elegantne degradacije, on povećava stabilnost aplikacije i poboljšava korisničko iskustvo. Pažljivim razmatranjem detalja implementacije i izbjegavanjem uobičajenih antiobrazaca, možete učinkovito iskoristiti obrazac prekidača strujnog kruga za stvaranje robusnijih i pouzdanijih softverskih sustava. Njegova globalna primjenjivost čini ga ključnim razmatranjem za bilo koju aplikaciju dizajniranu za raznoliku i međunarodnu korisničku bazu. Razumijevanje i implementacija obrasca prekidača strujnog kruga ključni su za moderne prakse softverskog inženjerstva. Proaktivnim rješavanjem potencijalnih kvarova, programeri mogu izgraditi sustave koji su bolje opremljeni za suočavanje s neizbježnim izazovima distribuiranog računalstva.