Apache Kafka og RabbitMQ er to mye brukte meldingsmeglere som tillater frakobling av utveksling av meldinger mellom applikasjoner. Hva er deres viktigste egenskaper, og hva gjør dem forskjellige fra hverandre? La oss komme til konseptene.
Innholdsfortegnelse
RabbitMQ
RabbitMQ er en åpen kildekode-meldingsmeglerapplikasjon for kommunikasjon og meldingsutveksling mellom parter. Fordi den ble utviklet i Erlang, er den veldig lett og effektiv. Erlang-språket ble utviklet av Ericson med fokus på distribuerte systemer.
Det regnes som en mer tradisjonell meldingsmegler. Den er basert på utgiver-abonnentmønsteret, selv om den kan behandle kommunikasjon synkront eller asynkront, avhengig av hva som er satt i konfigurasjonen. Det sikrer også levering og bestilling av meldinger mellom produsenter og forbrukere.
Den støtter AMQP, STOMP, MQTT, HTTP og web socket-protokoller. Tre modeller for utveksling av meldinger: emne, fanout og direkte:
- Direkte og individuell utveksling etter emne eller tema [topic]
- Alle forbrukere koblet til køen mottar [fanout] beskjed
- Hver forbruker mottar en melding sendt [direct]
Følgende er komponentene til RabbitMQ:
Produsenter
Produsenter er applikasjoner som lager og sender meldinger til RabbitMQ. De kan være en hvilken som helst applikasjon som kan koble til RabbitMQ og publisere meldinger.
Forbrukere
Forbrukerne er applikasjoner som mottar og behandler meldinger fra RabbitMQ. De kan være en hvilken som helst applikasjon som kan koble til RabbitMQ og abonnere på meldinger.
Utvekslinger
Utvekslinger er ansvarlige for å motta meldinger fra produsenter og dirigere dem til riktige køer. Det finnes flere typer utvekslinger, inkludert direkte-, fanout-, emne- og overskriftsutvekslinger, hver med sine egne rutingsregler.
Køer
Køer er der meldinger lagres til de blir konsumert av forbrukere. De opprettes av applikasjoner eller automatisk av RabbitMQ når en melding publiseres til en børs.
Bindinger
Bindinger definerer forholdet mellom sentraler og køer. De spesifiserer rutingsreglene for meldinger, som brukes av sentraler for å rute meldinger til de riktige køene.
Arkitektur av RabbitMQ
RabbitMQ bruker en pull-modell for meldingslevering. I denne modellen ber forbrukerne aktivt om meglerens meldinger. Meldinger publiseres til sentraler som er ansvarlige for å dirigere meldinger til de riktige køene basert på rutingnøkler.
Arkitekturen til RabbitMQ er basert på en klient-server-arkitektur og består av flere komponenter som jobber sammen for å gi en pålitelig og skalerbar meldingsplattform. AMQP-konseptet sørger for komponentene Exchanges, Queues, Bindings, samt utgivere og abonnenter. Utgivere publiserer meldinger til børser.
Utvekslinger tar disse meldingene og distribuerer dem til 0 til n køer basert på visse regler (bindinger). Meldingene som er lagret i køene kan deretter hentes av forbrukere. I en forenklet form gjøres meldingsbehandling i RabbitMQ som følger:
Bildekilde: VMware
- Utgivere sender meldinger for å utveksle;
- Exchange sender meldinger til køer og andre sentraler;
- Når en melding mottas, sender RabbitMQ bekreftelser til avsendere;
- Forbrukere opprettholder vedvarende TCP-forbindelser til RabbitMQ og erklærer hvilken kø de mottar;
- RabbitMQ ruter meldinger til forbrukere;
- Forbrukere sender suksess- eller feilbekreftelser for å ha mottatt meldingen;
- Ved vellykket mottak fjernes meldingen fra køen.
Apache Kafka
Apache Kafka er en distribuert åpen kildekode-meldingsløsning utviklet av LinkedIn i Scala. Den er i stand til å behandle meldinger og lagre dem med en utgiver-abonnentmodell med høy skalerbarhet og ytelse.
For å lagre hendelsene eller meldingene som mottas, distribuer emnene mellom nodene ved hjelp av partisjoner. Den kombinerer både utgiver-abonnent- og meldingskømønstre, og den er også ansvarlig for å sikre rekkefølgen på meldinger for hver forbruker.
Kafka spesialiserer seg på høy datagjennomstrømning og lav latens for å håndtere datastrømmer i sanntid. Dette oppnås ved å unngå for mye logikk på server (megler) side, samt noen spesielle implementeringsdetaljer.
Kafka bruker for eksempel ikke RAM i det hele tatt og skriver data umiddelbart til serverens filsystem. Siden alle data skrives sekvensielt, oppnås lese-skriveytelse, som er sammenlignbar med RAM.
Dette er hovedkonseptene til Kafka som gjør den skalerbar, ytelsesdyktig og feiltolerant:
Emne
Et emne er en måte å merke eller kategorisere et budskap på; se for deg et skap med 10 skuffer; hver skuff kan være et emne, og skapet er Apache Kafka-plattformen, så i tillegg til å kategorisere den grupperer meldinger, vil en annen bedre analogi om emnet bli lagt inn i relasjonsdatabaser.
Produsent
Produsenten eller produsenten er den som kobler seg til en meldingsplattform og sender en eller flere meldinger om et spesifikt emne.
Forbruker
Forbrukeren er personen som kobler seg til en meldingsplattform og bruker en eller flere meldinger om et spesifikt emne.
Megler
Konseptet med en megler i Kafka-plattformen er ikke noe mer enn praktisk talt Kafka selv, og det er han som administrerer temaene og definerer måten å lagre meldinger, logger osv. på.
Klynge
Klyngen er et sett med meglere som kommuniserer med hverandre eller ikke for bedre skalerbarhet og feiltoleranse.
Loggfil
Hvert emne lagrer sine poster i et loggformat, det vil si på en strukturert og sekvensiell måte; loggfilen er derfor filen som inneholder informasjon om et emne.
Skillevegger
Partisjonene er partisjonslaget av meldinger innenfor et emne; denne partisjoneringen sikrer elastisiteten, feiltoleransen og skalerbarheten til Apache Kafka, slik at hvert emne kan ha flere partisjoner på forskjellige steder.
Arkitektur av Apache Kafka
Kafka er basert på en push-modell for meldingslevering. Ved å bruke denne modellen blir meldinger i Kafka aktivt presset til forbrukerne. Meldinger publiseres til emner, som er partisjonert og fordelt på ulike meglere i klyngen.
Forbrukere kan deretter abonnere på ett eller flere emner og motta meldinger etter hvert som de produseres om disse emnene.
I Kafka er hvert emne delt inn i en eller flere partisjoner. Det er i skilleveggen at hendelsene havner.
Hvis det er mer enn én megler i klyngen, vil partisjonene fordeles jevnt over alle meglere (så langt det er mulig), noe som vil tillate å skalere belastningen på skriving og lesing i ett emne til flere meglere samtidig. Siden det er en klynge, kjører den ved hjelp av ZooKeeper for synkronisering.
Den mottar butikker og distribuerer poster. En post er data generert av en systemnode, som kan være en hendelse eller informasjon. Den sendes til klyngen, og klyngen lagrer den i en emnepartisjon.
Hver post har en sekvensoffset, og forbrukeren kan kontrollere offset den forbruker. Således, hvis det er behov for å behandle emnet på nytt, kan det gjøres basert på offset.
Bildekilde: Wikipedia
Logikk, slik som administrasjonen av den sist leste meldings-IDen til en forbruker eller beslutningen om hvilken partisjon som nylig ankom data skrives til, blir fullstendig flyttet til klienten (produsent eller forbruker).
I tillegg til begrepene produsent og forbruker, er det også begrepene emne, partisjon og replikering.
Et emne beskriver en kategori med meldinger. Kafka oppnår feiltoleranse ved å replikere dataene i et emne og skalere ved å partisjonere emnet på tvers av flere servere.
RabbitMQ vs. Kafka
Hovedforskjellene mellom Apache Kafka og RabbitMQ skyldes fundamentalt forskjellige meldingsleveringsmodeller implementert i disse systemene.
Spesielt Apache Kafka opererer etter prinsippet om å trekke (pull) når forbrukerne selv får de meldingene de trenger fra temaet.
RabbitMQ implementerer på sin side push-modellen ved å sende de nødvendige meldingene til mottakerne. Som sådan skiller Kafka seg fra RabbitMQ på følgende måter:
#1. Arkitektur
En av de største forskjellene mellom RabbitMQ og Kafka er forskjellen i arkitekturen. RabbitMQ bruker en tradisjonell meglerbasert meldingskøarkitektur, mens Kafka bruker en distribuert strømmeplattformarkitektur.
Dessuten bruker RabbitMQ en pull-basert meldingsleveringsmodell, mens Kafka bruker en push-basert modell.
#2. Lagre meldinger
RabbitMQ legger meldingen i FIFO-køen (First Input – First Output) og overvåker statusen til denne meldingen i køen, og Kafka legger meldingen til loggen (skriver til disk), og lar mottakeren sørge for å skaffe nødvendig informasjon fra emnet.
RabbitMQ sletter meldingen etter at den er levert til mottakeren, mens Kafka lagrer meldingen til den skal rydde opp i loggen.
Dermed lagrer Kafka gjeldende og alle tidligere systemtilstander og kan brukes som en pålitelig kilde til historiske data, i motsetning til RabbitMQ.
#3. Lastbalansering
Takket være pull-modellen for meldingslevering, reduserer RabbitMQ ventetiden. Det er imidlertid mulig for mottakere å flyte over hvis meldinger kommer raskere til køen enn de kan behandle dem.
Siden i RabbitMQ, hver mottaker ber om/laster opp et forskjellig antall meldinger, kan fordelingen av arbeidet bli ujevn, noe som vil føre til forsinkelser og tap av meldingsrekkefølge under behandling.
For å forhindre dette konfigurerer hver RabbitMQ-mottaker en forhåndshentingsgrense, en grense på antall akkumulerte ubekreftede meldinger. I Kafka utføres lastbalansering automatisk ved å omfordele mottakere på tvers av seksjoner (partisjon) av emnet.
#4. Ruting
RabbitMQ inkluderer fire måter å rute til forskjellige sentraler for kø, noe som gir et kraftig og fleksibelt sett med meldingsmønstre. Kafka implementerer bare én måte å skrive meldinger til disk uten ruting.
#5. Bestilling av meldinger
RabbitMQ lar deg opprettholde relativ rekkefølge i vilkårlige sett (grupper) av hendelser, og Apache Kafka gir en enkel måte å opprettholde rekkefølge med skalerbarhet ved å skrive meldinger sekvensielt til en replikert logg (emne).
FeatureRabbitMQKafka Arkitektur Lagrer meldinger på en disk koblet til meglerDistribuert strømmeplattformarkitekturLeveringsmodellPullbasertPush-basertLagre meldingerKan ikke lagre meldingerVedholder bestillinger ved å skrive til et emneLoad BalancingKonfigurerer en forhåndshentingsgrenseUtføres automatisk RutingInkluderer kun 4 måter å skrive på ruten iMa-ordre-grupper. til emne Eksterne prosesser Krever ikke Krever å kjøre Zookeeper-forekomst Plugins Flere pluginsHar begrenset plugin-støtte
RabbitMQ og Kafka er begge mye brukte meldingssystemer, hver med sine egne styrker og bruksområder. RabbitMQ er et fleksibelt, pålitelig og skalerbart meldingssystem som utmerker seg i meldingskø, noe som gjør det til et ideelt valg for applikasjoner som krever pålitelig og fleksibel meldingslevering.
På den annen side er Kafka en distribuert strømmeplattform som er designet for høy-gjennomstrømning, sanntidsbehandling av store datamengder, noe som gjør den til et godt valg for applikasjoner som krever sanntidsbehandling og analyse av data.
Hovedbrukstilfeller for RabbitMQ:
E-handel
RabbitMQ brukes i e-handelsapplikasjoner for å administrere dataflyten mellom ulike systemer, for eksempel lagerstyring, ordrebehandling og betalingsbehandling. Den kan håndtere store mengder meldinger og sørge for at de leveres pålitelig og i riktig rekkefølge.
Helsevesen
I helsesektoren brukes RabbitMQ til å utveksle data mellom ulike systemer, for eksempel elektroniske helsejournaler (EPJ), medisinsk utstyr og kliniske beslutningsstøttesystemer. Det kan bidra til å forbedre pasientbehandlingen og redusere feil ved å sikre at riktig informasjon er tilgjengelig til rett tid.
Finansielle tjenester
RabbitMQ muliggjør sanntidsmeldinger mellom systemer, slik som handelsplattformer, risikostyringssystemer og betalingsgatewayer. Det kan bidra til å sikre at transaksjoner behandles raskt og sikkert.
IoT-systemer
RabbitMQ brukes i IoT-systemer for å administrere dataflyt mellom ulike enheter og sensorer. Det kan bidra til å sikre at data leveres sikkert og effektivt, selv i miljøer med begrenset båndbredde og intermitterende tilkobling.
Kafka er en distribuert strømmeplattform designet for å håndtere store datamengder i sanntid.
Hovedbrukstilfeller for Kafka
Sanntidsanalyse
Kafka brukes i sanntidsanalyseapplikasjoner for å behandle og analysere data etter hvert som de genereres, slik at bedrifter kan ta beslutninger basert på oppdatert informasjon. Den kan håndtere store datamengder og skalere for å møte behovene til selv de mest krevende applikasjonene.
Loggaggregering
Kafka kan samle logger fra forskjellige systemer og applikasjoner, slik at virksomheter kan overvåke og feilsøke sanntidsproblemer. Den kan også brukes til å lagre logger for langsiktig analyse og rapportering.
Maskinlæring
Kafka brukes i maskinlæringsapplikasjoner for å strømme data til modeller i sanntid, slik at bedrifter kan komme med spådommer og iverksette tiltak basert på oppdatert informasjon. Det kan bidra til å forbedre nøyaktigheten og effektiviteten til maskinlæringsmodeller.
Min mening om både RabbitMQ og Kafka
Ulempen med RabbitMQs brede og varierte muligheter for fleksibel håndtering av meldingskøer er økt ressursforbruk og følgelig ytelsesforringelse under økt belastning. Siden dette er driftsmåten for komplekse systemer, er Apache Kafka i de fleste tilfeller det beste verktøyet for å administrere meldinger.
For eksempel, når det gjelder innsamling og aggregering av mange hendelser fra dusinvis av systemer og tjenester, tatt i betraktning deres georeservasjoner, klientmålinger, loggfiler og analyser, med utsikter til økende informasjonskilder, vil jeg foretrekke å bruke Kafka, men hvis du er i en situasjon der du bare trenger raske meldinger, vil RabbitMQ gjøre jobben helt fint!
Du kan også lese hvordan du installerer Apache Kafka i Windows og Linux.