Clojure: funksjonell programmering og backendutvikling på JVM · leksjon

Systemutforming og skalerbarhetsmønstre

Bruk avanserte systemutformingsmønstre til å bygge svært tilgjengelige, feiltolerante og skalerbare backend-tjenester i Clojure.

Leksjon 3 av 411 trinn

Systemutforming og skalerbarhetsmønstre er en gratis leksjon i Clojure: funksjonell programmering og backendutvikling på JVM på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Clojure: funksjonell programmering og backendutvikling på JVM, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Clojure: funksjonell programmering og backendutvikling på JVM inneholder totalt 4 leksjoner.

Utforming for skalering

Å bygge robuste Clojure-backendsystemer handler om mer enn bare å skrive kode. Det innebærer å utforme systemet for høy tilgjengelighet, feiltoleranse og skalerbarhet.

Disse prinsippene sørger for at applikasjonen kan håndtere økt belastning, gjenopprettes etter feil og forbli tilgjengelig for brukerne.

Sikre høy tilgjengelighet

Høy tilgjengelighet (HA) betyr at systemet forblir operativt selv når komponenter svikter. Det handler om å minimere nedetid.

  • Redundans: Å ha dupliserte komponenter (for eksempel flere servere), slik at en annen tar over hvis én svikter.
  • Lastbalansering: Å fordele innkommende trafikk på flere instanser av tjenesten for å hindre overbelastning og sikre jevn ressursbruk.

Lastbalansererens rolle

Se for Dem at mange brukere benytter Clojure-tjenesten. En lastbalanserer fungerer som en trafikkdirigent og sender hver forespørsel til en tilgjengelig serverinstans.

Dette hindrer at én enkelt server blir en flaskehals, og forbedrer systemets samlede responstid og pålitelighet.

Feiltoleranse: Circuit Breaker

Feiltoleranse betyr at systemet kan fortsette å fungere selv om enkelte deler svikter. Et vanlig mønster for dette er Circuit Breaker.

Når en tjeneste kaller en annen (for eksempel en database eller et eksternt API), overvåker circuit breakeren disse kallene. Hvis for mange mislykkes, «åpner» den kretsen, hindrer flere kall til den sviktende tjenesten og lar den gjenopprettes.

Demo av Circuit Breaker

Her er et forenklet Clojure-eksempel på en circuit breaker. Den hindrer gjentatte kall til en funksjon som feiler, etter et visst antall feil.

(def circuit (atom {:state :closed :failures 0 :last-open 0}))
(def failure-threshold 3)
(def reset-timeout-ms 5000)

(defn- current-time-ms [] (System/currentTimeMillis))

(defn with-circuit-breaker [f]
  (let [{:keys [state failures last-open]} @circuit]
    (cond
      (= state :open)
      (if (> (- (current-time-ms) last-open) reset-timeout-ms)
        (do (swap! circuit assoc :state :half-open)
            (println "Circuit half-open, trying call...")
            (try
              (f)
              (do (swap! circuit assoc :state :closed :failures 0)
                  (println "Circuit closed!"))
              (catch Exception e
                (swap! circuit assoc :state :open :last-open (current-time-ms))
                (println "Circuit back to open!")
                (throw e))))
        (throw (ex-info "Circuit is open!" {:circuit-state :open})))

      (= state :half-open)
      (try
        (f)
        (do (swap! circuit assoc :state :closed :failures 0)
            (println "Circuit closed!"))
        (catch Exception e
          (swap! circuit assoc :state :open :last-open (current-time-ms))
          (println "Circuit back to open!")
          (throw e)))

      :else ; :closed
      (try
        (f)
        (do (swap! circuit assoc :failures 0)
            (println "Call successful!"))
        (catch Exception e
          (swap! circuit update :failures inc)
          (if (>= (:failures @circuit) failure-threshold)
            (do (swap! circuit assoc :state :open :last-open (current-time-ms))
                (println "Circuit opened!"))
            (println "Failure count:" (:failures @circuit)))
          (throw e)))))

(defn unreliable-service []
  (if (> (rand) 0.7)
    (throw (RuntimeException. "Service failed!"))
    (println "Service call successful.")))

(defn -main [& args]
  (println "--- Running Circuit Breaker Demo ---")
  (dotimes [i 10]
    (println "\nAttempt" (inc i))
    (try
      (with-circuit-breaker unreliable-service)
      (catch Exception e
        (println "Caught exception:" (.getMessage e))))
    (Thread/sleep 1000)) ; Wait for a bit
  (println "\n--- Demo End ---"))

Mer feiltoleranse

I tillegg til circuit breakers finnes det andre mønstre som forbedrer feiltoleransen:

  • Gjentakelser med eksponentiell tilbakeventing: Prøv automatisk mislykkede operasjoner på nytt, og vent lenger mellom hvert forsøk for å unngå å overbelaste en tjeneste som er i ferd med å gjenopprettes.
  • Skott: Isoler komponenter (for eksempel ved å bruke separate trådpooler for ulike tjenester), slik at én del som svikter, ikke tar ned hele applikasjonen.

Skalere opp eller ut?

Skalerbarhet er et systems evne til å håndtere en voksende arbeidsmengde. Det finnes to hovedstrategier:

  • Vertikal skalering (skalere opp): Øke ressursene på én enkelt server (for eksempel mer CPU eller RAM). Dette har begrensninger.
  • Horisontal skalering (skalere ut): Legge til flere servere eller instanser for å fordele belastningen. Dette foretrekkes ofte for skybaserte applikasjoner.

Ta i bruk statsløshet

For effektiv horisontal skalering bør Clojure-backendtjenestene helst være statsløse.

En statsløs tjeneste lagrer ikke klientsesifikke data mellom forespørsler. Hver forespørsel inneholder all nødvendig informasjon. Da blir det enkelt å legge til eller fjerne tjenesteinstanser uten å miste data om brukersesjonen.

Øk ytelsen med distribuert hurtigbuffer

Distribuert hurtigbufring er et viktig skaleringsmønster. I stedet for å spørre databasen ved hver forespørsel kan data som brukes ofte, lagres i en rask hurtigbuffer i minnet, delt mellom alle tjenesteinstansene.

Dette reduserer belastningen på databasen, forbedrer responstiden og gjør det mulig for backend-systemet å håndtere flere forespørsler effektivt.

Test kunnskapene dine

Tenk på en Clojure-mikrotjeneste som er avhengig av en ekstern betalingsløsning. Hvilket mønster vil være mest effektivt for å hindre kaskaderende feil hvis betalingsløsningen slutter å svare?

Oppsummering av systemdesign

I denne leksjonen utforsket vi viktige systemdesignmønstre for å bygge skalerbare, svært tilgjengelige og feiltolerante Clojure-backendtjenester.

  • Vi gikk gjennom høy tilgjengelighet med redundans og lastbalansering.
  • Vi fordypet oss i feiltoleranse ved hjelp av circuit breakers, gjentakelser og skott.
  • Vi så på skalerbarhet gjennom horisontal skalering, statsløse tjenester og distribuert hurtigbufring.

Ved å ta i bruk disse mønstrene kan De bygge robuste systemer som er klare for kravene i den virkelige verden!

Gratis å komme i gang

Lær deg Clojure med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Systemutforming og skalerbarhetsmønstre» gratis?

Ja – hele teksten i «Systemutforming og skalerbarhetsmønstre» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Clojure: funksjonell programmering og backendutvikling på JVM-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Clojure: funksjonell programmering og backendutvikling på JVM inneholder totalt 4 leksjoner.

Hva lærer jeg i «Systemutforming og skalerbarhetsmønstre»?

Bruk avanserte systemutformingsmønstre til å bygge svært tilgjengelige, feiltolerante og skalerbare backend-tjenester i Clojure. Du øver på Clojure: funksjonell programmering og backendutvikling på JVM med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Clojure: funksjonell programmering og backendutvikling på JVM?

Ingen tidligere erfaring er nødvendig. Clojure: funksjonell programmering og backendutvikling på JVM på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Systemutforming og skalerbarhetsmønstre»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Clojure: funksjonell programmering og backendutvikling på JVM-leksjonen?

Ja. Alle Clojure: funksjonell programmering og backendutvikling på JVM-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Bygge et RESTful API
  2. Hendelsesdrevne arkitekturer
  3. Systemutforming og skalerbarhetsmønstre
  4. Autentisering og autorisering
← Tilbake til Clojure: funksjonell programmering og backendutvikling på JVM