Eventgestuurde architecturen
Verken de principes en implementatie van eventgestuurde systemen met message queues en brokers in Clojure.
Eventgestuurde architecturen is een gratis Functioneel programmeren met Clojure en backendontwikkeling op de JVM-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Functioneel programmeren met Clojure en backendontwikkeling op de JVM. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Functioneel programmeren met Clojure en backendontwikkeling op de JVM bevat in totaal 4 lessen.
Introductie tot gebeurtenisgestuurde systemen
Gebeurtenisgestuurde architectuur (EDA) is een ontwerppatroon waarbij componenten communiceren door gebeurtenissen te verzenden en erop te reageren. In plaats van functies rechtstreeks aan te roepen, publiceren onderdelen van je systeem gebeurtenissen wanneer er iets interessants gebeurt.
Deze aanpak helpt bij het maken van systemen die:
- Ontkoppeld: componenten hoeven niets van elkaar te weten.
- Schaalbaar: je kunt eenvoudig meer consumenten toevoegen zonder producenten te wijzigen.
- Veerkrachtig: fouten in één onderdeel zullen minder snel het hele systeem platleggen.
Gebeurtenissen: het kernbericht
Een gebeurtenis is een registratie van iets dat is gebeurd. Het is meestal een klein, onveranderlijk bericht met gegevens over de gebeurtenis, maar niet de opdracht om een actie uit te voeren.
Zie het als een krantenkop: "Gebruiker heeft zich aangemeld" of "Bestelling geplaatst".
Belangrijke kenmerken:
- Feit: de gebeurtenis beschrijft iets dat heeft plaatsgevonden.
- Onveranderlijk: zodra een gebeurtenis is gepubliceerd, verandert deze niet meer.
- Informatief: bevat relevante gegevens (bijvoorbeeld gebruikers-ID en tijdstempel).
Rollen: producenten en consumenten
In een EDA zijn er twee hoofdrollen:
- Producenten: dit zijn componenten die gebeurtenissen maken en publiceren. Wanneer een gebruiker zich aanmeldt, kan de "User Service" een gebeurtenis "User Signed Up" produceren.
- Consumenten: dit zijn componenten die zich abonneren op gebeurtenissen en erop reageren. Een "Welcome Email Service" kan gebeurtenissen "User Signed Up" consumeren om een welkomstmail te versturen.
De producent hoeft niet te weten wie de gebeurtenis consumeert, en consumenten hoeven niet te weten wie deze heeft geproduceerd. Dit maakt krachtige ontkoppeling mogelijk!
Berichtenmakelaars: het knooppunt
Hoe vinden producenten en consumenten elkaar? Daar komt een berichtenmakelaar van pas. Een broker fungeert als tussenpersoon: hij ontvangt gebeurtenissen van producenten en bezorgt ze aan geïnteresseerde consumenten.
De broker biedt:
- Ontkoppeling: producenten en consumenten communiceren niet rechtstreeks.
- Duurzaamheid: gebeurtenissen kunnen worden opgeslagen totdat consumenten klaar zijn.
- Routering: gebeurtenissen worden op basis van regels naar de juiste consumenten gestuurd.
Veelgebruikte voorbeelden zijn RabbitMQ, Apache Kafka en AWS SQS.
Clojure en berichtenbibliotheken
Clojure is door de focus op onveranderlijkheid en concurrency zeer geschikt voor gebeurtenisgestuurde systemen. We gebruiken vaak speciale clientbibliotheken om met berichtenmakelaars te communiceren.
Voor RabbitMQ is langohr een populaire keuze in Clojure. Deze bibliotheek biedt een eenvoudige API om verbinding te maken, berichten te publiceren en berichten te consumeren.
Laten we bekijken hoe je een basisverbinding instelt en een gebeurtenis publiceert met langohr (conceptueel, omdat een volledige configuratie te uitgebreid is voor een klein fragment).
Een gebeurtenis publiceren
Om een gebeurtenis te publiceren, maken we verbinding met de berichtenmakelaar en sturen we onze gebeurtenisgegevens naar een specifieke exchange. Een exchange kun je zien als een postkantoor dat berichten routeert.
Hier volgt een vereenvoudigd voorbeeld waarin een gebeurtenis "user.signed-up" wordt gepubliceerd naar een topic-exchange met de naam "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)))Een gebeurtenis consumeren
Consumenten maken verbinding met de broker en declareren een queue. Vervolgens koppelen ze deze wachtrij aan een exchange met een routing key om specifieke soorten gebeurtenissen te ontvangen. Wanneer er een gebeurtenis binnenkomt, verwerkt een handlerfunctie deze.
Dit voorbeeld toont een consument die luistert naar gebeurtenissen van het type "user.signed-up":
(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))))Waarom EDA krachtig is
Naast eenvoudige ontkoppeling biedt EDA aanzienlijke voordelen voor complexe systemen:
- Schaalbaarheid: voeg eenvoudig meer consumenten toe om gebeurtenissen parallel te verwerken, of schaal producenten onafhankelijk op.
- Veerkracht: als een consument uitvalt, houdt de berichtenmakelaar gebeurtenissen vast totdat de consument is hersteld, zodat er geen gegevens verloren gaan.
- Controleerbaarheid: gebeurtenissen kunnen worden gelogd en bieden zo een duidelijk controlespoor van systeemactiviteiten.
- Realtimeverwerking: reageer direct op wijzigingen in verschillende services.
Het is een fundamenteel patroon voor microservices en gedistribueerde systemen.
Het concept Event Sourcing
Een krachtig verwant concept is Event Sourcing. In plaats van de huidige toestand van een toepassing op te slaan, sla je alle wijzigingen op als een reeks onveranderlijke gebeurtenissen.
De toestand van de toepassing kan vervolgens worden gereconstrueerd door deze gebeurtenissen opnieuw af te spelen. Dit levert een volledige historische registratie op en vereenvoudigt in sommige situaties het beheer van complexe toestanden.
Hoewel de concepten verwant zijn, richt EDA zich op communicatie tussen services, terwijl Event Sourcing zich richt op de manier waarop één service zijn eigen toestand beheert.
Korte controle: EDA-principes
Bekijk een systeem waarin een gebruiker een bestelling plaatst. Welke van de volgende uitspraken beschrijft een gebeurtenisgestuurde aanpak het best?
Samenvatting en volgende stappen
Goed gedaan! Je hebt de basisprincipes van gebeurtenisgestuurde architecturen verkend.
- We hebben geleerd dat gebeurtenissen onveranderlijke feiten zijn over dingen die zijn gebeurd.
- Producenten publiceren gebeurtenissen en consumenten reageren daarop.
- Een berichtenbroker maakt deze communicatie mogelijk en zorgt voor ontkoppeling en veerkracht.
- Clojure-bibliotheken zoals
langohrmaken het eenvoudig om te integreren met brokers zoals RabbitMQ.
EDA is een cruciaal patroon voor het bouwen van schaalbare, veerkrachtige en ontkoppelde backendsystemen. Blijf oefenen met berichtensystemen om je begrip te verdiepen!
Leer Clojure met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Eventgestuurde architecturen” gratis?
Ja — de volledige tekst van “Eventgestuurde architecturen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Functioneel programmeren met Clojure en backendontwikkeling op de JVM wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Functioneel programmeren met Clojure en backendontwikkeling op de JVM bevat in totaal 4 lessen.
Wat leer ik in “Eventgestuurde architecturen”?
Verken de principes en implementatie van eventgestuurde systemen met message queues en brokers in Clojure. Je oefent met Functioneel programmeren met Clojure en backendontwikkeling op de JVM door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Functioneel programmeren met Clojure en backendontwikkeling op de JVM te beginnen?
Ervaring vooraf is niet nodig. Functioneel programmeren met Clojure en backendontwikkeling op de JVM op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Eventgestuurde architecturen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Functioneel programmeren met Clojure en backendontwikkeling op de JVM?
Ja. Elke les over Functioneel programmeren met Clojure en backendontwikkeling op de JVM bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Een RESTful API bouwen
- Eventgestuurde architecturen
- Systeemontwerp en schaalbaarheidspatronen
- Authenticatie en autorisatie