
Fagdag : Kafka workshop
Forrige fagdag var en workshop i Kafka. Det ble en innholdsrik og lærerik dag. Vi fikk god innføring i Kafka og økosystemet rundt i tillegg til praktiske oppgaver som gav oss bedre forståelse og innsikt. Dette var gøy!
Vi ble loset trygt gjennom workshopen av Joar Aurdal, Frode Rystad, Dejan Maric og Thore Johnsen.
Programmet for dagen så slik ut:
- Introduksjon til Kafka & Oppgave 1
- Økosystemet rundt Kafka
- Oppgave 2: Kotlin Kafka - Producer, Consumer og Streams
- Kafka Avro Presentasjon & Oppgave 3
- Rapids & Rivers Presentasjon & Oppgave 4
Kort om Kafka.
Apache Kafka er en distribuert strømningsbehandlingsplattform. Den ble opprinnelig utviklet av LinkedIn og ble senere bidratt til Apache Software Foundation. Kafka er designet for å håndtere høye datavolumer med lav latenstid, og gir en høy gjennomstrømning for sanntidsdatastrømmer.
Her er noen av hovedegenskapene og funksjonene til Apache Kafka:
- Tilgjengelighet og Skalerbarhet: Kafka gir en horisontalt skalerbar og feiltolerant arkitektur. Dette betyr at du kan legge til flere noder (servere) i en Kafka-kluster for å håndtere økt belastning, og hvis en node mislykkes, vil systemet fortsette å fungere.
- Temaer: I Kafka produserer og publiserer klienter meldinger til topics. Topics kan sammenlignes med loggfiler hvor meldinger blir lagret i rekkefølge.
- Produsenter og Konsumenter: Kafka har en produsent-konsumentarkitektur. "Produsenter" sender meldinger til Kafka-temaer, mens "konsumenter" leser meldinger fra disse temaene.
- Garantert Rekkefølge: Innenfor et bestemt topic-partisjon i Kafka, er rekkefølgen av meldinger garantert.
- Varig lagring: Meldinger i Kafka kan konfigureres til å være varige, noe som betyr at de kan lagres i en bestemt tidsperiode (for eksempel 7 dager) eller inntil en viss størrelse på lagring er nådd.
- Forbrukergrupper: For å skalere leseoperasjoner og sørge for at hver melding leses en gang, støtter Kafka konseptet med forbrukergrupper. En forbrukergruppe er en gruppe konsumentinstanser som jobber sammen for å konsumere data fra ett eller flere temaer.
- Strømningsbehandling med Kafka Streams: Dette er en biblioteksfunktionalitet i Kafka som gjør det mulig å behandle, analysere og manipulere innkommende strømmer av data i sanntid.
- Tilkoblingsrammeverk: Kafka Connect gjør det mulig å bygge og kjøre gjenbrukbare produsenter og konsumenter som kobler Kafka-temaer til eksisterende applikasjoner eller datasystemer.
- Sikkerhet: Kafka tilbyr flere sikkerhetsfunksjoner som autentisering, autorisasjon, og datakryptering.
Kafka er blitt svært populær blant organisasjoner som trenger en pålitelig og skalerbar måte å håndtere store mengder data i sanntid. Den brukes i en rekke applikasjoner, fra sanntidsanalyse til loggaggregasjon, systemovervåking, og event sourcing.
Introduksjon til Kafka
Dejan Maric jobber med Kafka hos Statnett hvor han opprettet og drifter flere Kafka klustere. Han fortalte hva Kafka er og hvorfor vi skulle ta den i bruke. Noen av use caser som loggaggregering, event sourcing og stream prosessering var introdusert i denne sesjonen. Vi lærte om byggesteinene som for eksempel topic, partisjon og replikering. Formålet med partisjoner er å distribuere data mellom flere servere og muliggjøre parallell behandling av meldinger, mens replikeringen gjør kafka feiltolerant og mulig å skalere horisontalt. Sesjonen endte med oppgaven der deltakere startet et kafka kluster lokalt samt produsert og konsumert meldingene ved bruk av kafka CLI verktøy.
Økosystemet rundt Kafka.
Etter en grundig introduksjon ble det en rundreise i økosystemet rundt Kafka. Thore Johnsen (for tiden hos Tietoevry) fortalte om Kafka Streams, Kafka Connect m.m. og hvordan Kafka protokollen i seg selv har blitt en de facto standard som også konkurrerende produkter implementerer (RedPanda, Pulsar, Oracle AQ/TxEQ). Det ble vist kodeeksempler hvor MicroProfile Reactive Messaging forenkler koding mot Kafka og snakket om hvordan man skaffer seg Kafka med og uten tykk lommebok. For de som ønsker å kjøre Kafka selv ble det vist GitOps eksempel på hvordan opprettelse av brukere, topics og ACL fungere i praksis hos kunden med Strimzi som Kubernetes operator. Sesjonen touchet også innom skalering på konsumentsiden med 3rd party bibliotek som Confluent Parallel Consumer og hvordan KIP-932 vil kunne gi Kafka avansert køfunksjonalitet på sikt.
Kafka Introduksjonsoppgaver.
Joar Aurdal har erfaring med bruk av Kafka hos NAV. Han hadde klargjort introduksjonsoppgaver der deltakerene laget en enkel consumer og producer i Kafka, og i tillegg en oppgave i Kafka Streams. Dette ble implementert i Kotlin. Formålet med oppgavene var å gi en kort introduksjon til bruk av Kafka, og også å ha små kodesnutter som det kan jobbes videre med i løpet av workshopen.
Kafka Avro.
Deretter var det Frode Rystad sin tur. Han jobber for Politiets IT-tjenester, og bruker Kafka der. Frode fortalte hvordan man kan bruke Avro som serialiseringsformat for meldinger, som et alternativ til å publisere JSON som tekst. Avro er et binærformat, som både kan spare lagringsplass og gi høyere ytelse. Avro er skjemabasert. Skjema fungerer som kontrakt mellom publiserer og konsument, og kan være spesielt nyttig mellom systemer som forvaltes av forskjellige team. Det er vanlig å bruke Avro sammen med et skjemaregister, som bl.a. vil kontrollere at skjemaendringer er kompatible.
Frode demonstrerte først publisering og konsumering av Avro-meldinger ved hjelp av IntelliJ sitt Kafka-plugin, før deltakerne fikk i oppgave å endre produsenten og konsumenten de skrev i forrige oppgave til å utveksle Avro-meldinger i stedet for JSON. Kafka-broker og Confluent Schema Registry kjørte i Docker. Til slutt viste Frode en mer avansert demo, der han gjenbrukte samme datatype i flere skjema ved bruk av skjemareferanser, og hvordan man kan publisere meldinger med forskjellige skjema til ett og samme Kafka-topic ved bruk av datatypen union. Sistnevnte avviker fra utgangspunktet om ett skjema per topic, men kan være løsningen hvis man må garantere rekkefølge på meldinger av forskjellige typer.
Rapid Rivers Ponds.
Til slutt holdt Joar Aurdal en sesjon om rapids, rivers og ponds.
"Rapids-Rivers-Ponds" er et mønster/pattern for samhandling mellom mikrotjenester i en hendelsesdrevet arkitektur. Joar har erfaring med å implementere dette mønsteret hos NAV, og viste eksempler bruk derfra. Han hadde laget et lite rapids & rivers støttebibliotek for workshopen, slik at deltakerne raskt kunne lage enkle tjenester som samhandlet med hverandre via Rapids & Rivers.
Rapids: Kafka-topicene kan fungere som "Rapids" der et stort antall hendelser kontinuerlig publiseres og konsumeres. Kafka sin høye gjennomstrømming og skalerbarhet gjør den spesielt egnet for denne rollen.
Rivers: Mikrotjenestene, eller "Rivers" kan konsumere meldinger fra Kafka-topicene (Rapids). Etter behandling av disse meldingene, kan mikrotjenestene publisere nye eller oppdaterte meldinger tilbake til Rapids.
Ponds: Databaser som holder kilden til sannhet kan knyttes til mikrotjenestene (Rivers). Kafka kan også bidra her ved å opprettholde en strøm av endringsdata som kan holde databasene (Ponds) synkroniserte med hendelsene som flyter gjennom systemet.
Her kan du se video av foredragene fra fagdagen.
Vil du være med på vår neste fagdag?
Ta kontakt med oss i dag for en uforpliktende prat.
Relatert innhold