Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys · Oppitunti

Tapahtumavetoiset arkkitehtuurit

Tutustutte tapahtumavetoisten järjestelmien periaatteisiin ja toteutukseen käyttämällä viestijonoja ja välittäjiä Clojurella.

Oppitunti 2/411 vaihetta

Tapahtumavetoiset arkkitehtuurit on ilmainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-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 Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Johdatus tapahtumapohjaisiin järjestelmiin

Event-Driven Architecture (EDA) on suunnittelumalli, jossa komponentit viestivät lähettämällä ja käsittelemällä tapahtumia. Sen sijaan että järjestelmän osat kutsuisivat funktioita suoraan, ne julkaisevat tapahtumia, kun jotain kiinnostavaa tapahtuu.

Tämä lähestymistapa auttaa luomaan järjestelmiä, jotka ovat:

  • Väljästi kytkettyjä: Komponenttien ei tarvitse tuntea toisiaan.
  • Skaalautuvia: Kuluttajia voidaan lisätä helposti ilman tuottajien muuttamista.
  • Vikasietoisia: Yhden osan vikaantuminen aiheuttaa epätodennäköisemmin koko järjestelmän kaatumisen.

Tapahtumat: ydinsanoma

Tapahtuma on tallenne jostakin tapahtuneesta. Se on yleensä pieni, muuttumaton viesti, joka sisältää tapahtumaa koskevia tietoja mutta ei toimintoa suorittavaa komentoa.

Ajatelkaa sitä sanomalehden otsikkona: "User Signed Up" tai "Order Placed".

Keskeiset ominaisuudet:

  • Fakta: Se kuvaa jotain, mikä on tapahtunut.
  • Muuttumaton: Julkaisemisen jälkeen tapahtuma ei muutu.
  • Tiedottava: Se sisältää asiaankuuluvia tietoja (esimerkiksi käyttäjätunnisteen ja aikaleiman).

Roolit: tuottajat ja kuluttajat

EDA:ssa on kaksi pääroolia:

  • Tuottajat: Nämä komponentit luovat ja julkaisevat tapahtumia. Kun käyttäjä rekisteröityy, "User Service" voi tuottaa tapahtuman "User Signed Up".
  • Kuluttajat: Nämä komponentit tilaavat tapahtumia ja reagoivat niihin. "Welcome Email Service" voi kuluttaa "User Signed Up" -tapahtumia lähettääkseen tervetuloviestin.

Tuottajan ei tarvitse tietää, kuka kuluttaa tapahtuman, eikä kuluttajan tarvitse tietää, kuka sen tuotti. Tämä mahdollistaa tehokkaan väljän kytkennän!

Viestinvälittäjät: keskus

Miten tuottajat ja kuluttajat löytävät toisensa? Tässä astuu kuvaan viestinvälittäjä. Välittäjä toimii välikätenä: se vastaanottaa tapahtumia tuottajilta ja toimittaa ne niistä kiinnostuneille kuluttajille.

Se tarjoaa:

  • Väljää kytkentää: Tuottajat ja kuluttajat eivät viesti suoraan keskenään.
  • Pysyvyyttä: Tapahtumat voidaan tallentaa, kunnes kuluttajat ovat valmiita käsittelemään ne.
  • Reititystä: Tapahtumat ohjataan oikeille kuluttajille sääntöjen perusteella.

Yleisiä esimerkkejä ovat RabbitMQ, Apache Kafka ja AWS SQS.

Clojure ja viestikirjastot

Clojure sopii hyvin tapahtumapohjaisiin järjestelmiin, koska siinä painotetaan muuttumattomuutta ja samanaikaisuutta. Viestinvälittäjien kanssa toimimiseen käytetään usein tähän tarkoitukseen suunniteltuja asiakaskirjastoja.

RabbitMQ:ta varten suosittu valinta Clojure-ympäristössä on langohr. Se tarjoaa suoraviivaisen API:n yhteyden muodostamiseen, viestien julkaisemiseen ja kuluttamiseen.

Tarkastellaan, miten muodostetaan perusyhteys ja julkaistaan tapahtuma langohr-kirjaston avulla (käsitteellisellä tasolla, sillä täydellinen määritys olisi liian laaja pieneen koodiesimerkkiin).

Tapahtuman julkaiseminen

Tapahtuman julkaisemiseksi muodostamme yhteyden viestinvälittäjään ja lähetämme tapahtumadatan tiettyyn exchangeen. Exchange toimii kuin postitoimisto, joka reitittää viestejä.

Tässä on yksinkertaistettu esimerkki "user.signed-up"-tapahtuman julkaisemisesta topic-exchangeen nimeltä "events":

(ns coddykit.producer
  (:require [langohr.core :as lc]
            [langohr.channel :as lch]
            [langohr.exchange :as le]
            [langohr.basic :as lb]
            [cheshire.core :as json]))

(defn -main [& args]
  (let [conn (lc/connect {:host "localhost"})
        ch (lch/open conn)
        event-data {:user-id 123 :username "Alice" :timestamp (str (java.time.Instant/now))}]
    (le/declare ch "events" "topic" {:durable true}) ; Declare topic exchange
    (lb/publish ch "events" "user.signed-up" (json/generate-string event-data)
                {:content-type "application/json"})
    (println "Published user.signed-up event: " event-data)
    (lc/close ch)
    (lc/close conn)))

Tapahtuman kuluttaminen

Kuluttajat muodostavat yhteyden välittäjään ja ilmoittavat jonon. Sen jälkeen ne sitovat jonon exchangeen reititysavaimen avulla vastaanottaakseen tietyn tyyppisiä tapahtumia. Kun tapahtuma saapuu, käsittelijäfunktio käsittelee sen.

Tässä esimerkissä kuluttaja kuuntelee "user.signed-up"-tapahtumia:

(ns coddykit.consumer
  (:require [langohr.core :as lc]
            [langohr.channel :as lch]
            [langohr.queue :as lq]
            [langohr.basic :as lb]
            [langohr.consumers :as lcons]
            [cheshire.core :as json]))

(defn handle-message [ch metadata payload]
  (let [event (json/parse-string (String. payload "UTF-8") true)]
    (println "Received event: " event)
    (println "User" (:username event) "signed up! Sending welcome email...")
    ; Acknowledge the message to remove it from the queue
    (lb/ack ch (:delivery-tag metadata))))

(defn -main [& args]
  (let [conn (lc/connect {:host "localhost"})
        ch (lch/open conn)
        queue-name "welcome-email-queue"]
    (lq/declare ch queue-name {:durable true :exclusive false :auto-delete false})
    (lq/bind ch queue-name "events" {:routing-key "user.signed-up"}) ; Bind to topic exchange
    (println "Waiting for messages. To exit, press Ctrl+C...")
    (lcons/create-default ch queue-name handle-message {:auto-ack false})
    ; Keep the main thread alive to listen for messages
    (while true (Thread/sleep 1000))))

Miksi EDA on tehokas

Yksinkertaista väljää kytkentää pidemmälle mentäessä EDA tarjoaa merkittäviä etuja monimutkaisille järjestelmille:

  • Skaalautuvuus: Tapahtumien rinnakkaiseen käsittelyyn voidaan helposti lisätä kuluttajia, tai tuottajia voidaan skaalata toisistaan riippumatta.
  • Vikasietoisuus: Jos kuluttaja vikaantuu, viestinvälittäjä säilyttää tapahtumat sen palautumiseen asti, mikä estää datan menetyksen.
  • Auditointi: Tapahtumat voidaan kirjata, jolloin järjestelmän toiminnasta jää selkeä auditointijälki.
  • Reaaliaikainen käsittely: Muutoksiin voidaan reagoida välittömästi eri palveluissa.

Se on mikro- ja hajautettujen palvelujen perustavanlaatuinen suunnittelumalli.

Event Sourcing -periaate

Läheinen ja tehokas käsite on Event Sourcing. Sovelluksen nykyisen tilan tallentamisen sijaan kaikki muutokset tallennetaan muuttumattomien tapahtumien sarjana.

Sovelluksen tila voidaan tämän jälkeen rekonstruoida toistamalla tapahtumat. Näin saadaan täydellinen historiatietue, ja monimutkaisen tilanhallinnan toteuttaminen voi helpottua tietyissä tilanteissa.

Vaikka käsitteet liittyvät toisiinsa, EDA keskittyy palvelujen väliseen viestintään, kun taas Event Sourcing keskittyy siihen, miten yksittäinen palvelu hallitsee omaa tilaansa.

Pikatarkistus: EDA:n periaatteet

Tarkastellaan järjestelmää, jossa käyttäjä tekee tilauksen. Mikä seuraavista väitteistä kuvaa parhaiten tapahtumapohjaista lähestymistapaa?

Kertaus ja seuraavat vaiheet

Hienoa! Olette tutustuneet tapahtumavetoisten arkkitehtuurien perusteisiin.

  • Opimme, että tapahtumat ovat muuttumattomia faktoja tapahtuneista asioista.
  • Tuottajat julkaisevat tapahtumia, ja kuluttajat reagoivat niihin.
  • Viestinvälittäjä mahdollistaa tämän viestinnän ja varmistaa järjestelmän löyhän kytkennän sekä vikasietoisuuden.
  • Clojure-kirjastot, kuten langohr, helpottavat RabbitMQ:n kaltaisiin välittäjiin integroitumista.

EDA on keskeinen malli skaalautuvien, vikasietoisten ja löyhästi kytkettyjen taustajärjestelmien rakentamiseen. Jatkakaa viestintäjärjestelmien harjoittelua ymmärryksenne vahvistamiseksi!

Aloita maksutta

Opi Clojure 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 ”Tapahtumavetoiset arkkitehtuurit” ilmainen?

Kyllä – oppitunnin ”Tapahtumavetoiset arkkitehtuurit” 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 Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssin, päivitä CoddyKit PROhon. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tapahtumavetoiset arkkitehtuurit”?

Tutustutte tapahtumavetoisten järjestelmien periaatteisiin ja toteutukseen käyttämällä viestijonoja ja välittäjiä Clojurella. Harjoittelet Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Tapahtumavetoiset arkkitehtuurit”-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ä Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunnilla?

Kyllä. Jokainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-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

  1. RESTful API:n rakentaminen
  2. Tapahtumavetoiset arkkitehtuurit
  3. Järjestelmäsuunnittelu ja skaalautuvuusmallit
  4. Autentikointi ja valtuutus
← Takaisin: Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys