Поређење водећих платформи за размену порука

Apache Kafka i RabbitMQ su dva popularna posrednika za razmenu poruka koji omogućavaju da se komunikacija između aplikacija odvija nezavisno. Koje su njihove ključne karakteristike i po čemu se međusobno razlikuju? Razmotrimo osnovne koncepte.

RabbitMQ

RabbitMQ je aplikacija otvorenog koda koja služi kao posrednik u razmeni poruka između različitih strana. Razvijen je u Erlang programskom jeziku, što ga čini vrlo laganim i efikasnim. Erlang je jezik koji je razvio Ericsson sa fokusom na distribuirane sisteme.

Smatra se tradicionalnijim posrednikom za razmenu poruka. Zasnovan je na obrascu izdavač-pretplatnik, mada može da obrađuje komunikaciju sinhrono ili asinhrono, u zavisnosti od konfiguracije. Takođe, pruža garantovanu isporuku i redosled poruka između proizvođača i potrošača.

Podržava AMQP, STOMP, MQTT, HTTP i WebSocket protokole. Postoje tri modela razmene poruka: tema, emitovanje (fanout) i direktna:

  • Direktna i individualna razmena po temi [topic]
  • Svi potrošači koji su povezani na red primaju [fanout] poruku
  • Svaki potrošač dobija poslato poruku [direct]

Komponente RabbitMQ-a su:

Proizvođači

Proizvođači su aplikacije koje kreiraju i šalju poruke RabbitMQ-u. To može biti bilo koja aplikacija koja je u stanju da se poveže sa RabbitMQ-om i objavljuje poruke.

Potrošači

Potrošači su aplikacije koje primaju i obrađuju poruke od RabbitMQ-a. To može biti bilo koja aplikacija koja se može povezati sa RabbitMQ-om i pretplatiti na poruke.

Razmene

Razmene su odgovorne za primanje poruka od proizvođača i njihovo usmeravanje u odgovarajuće redove. Postoji nekoliko tipova razmena, uključujući direktnu, emitujuću (fanout), tematsku i razmenu zaglavlja, od kojih svaka ima svoja pravila usmeravanja.

Redovi

Redovi su mesta gde se poruke čuvaju dok ih potrošači ne preuzmu. Redove kreiraju aplikacije ili automatski RabbitMQ, kada se poruka objavi na razmeni.

Veze

Veze definišu odnos između razmena i redova. One određuju pravila usmeravanja poruka, koja razmene koriste za slanje poruka u odgovarajuće redove.

Arhitektura RabbitMQ

RabbitMQ koristi model „povlačenja“ (pull) za isporuku poruka. U ovom modelu, potrošači aktivno zahtevaju poruke od posrednika. Poruke se objavljuju na razmenama koje su odgovorne za usmeravanje poruka u odgovarajuće redove na osnovu ključeva usmeravanja.

Arhitektura RabbitMQ-a je zasnovana na klijent-server arhitekturi i sastoji se od nekoliko komponenti koje zajedno rade kako bi osigurale pouzdanu i skalabilnu platformu za razmenu poruka. AMQP koncept obezbeđuje komponente razmene, redove, veze, kao i izdavače i pretplatnike. Izdavači objavljuju poruke na razmenama.

Razmena preuzima ove poruke i distribuira ih u redove od 0 do n na osnovu određenih pravila (veza). Poruke koje su uskladištene u redovima zatim mogu preuzeti potrošači. Pojednostavljeno, upravljanje porukama u RabbitMQ-u se odvija na sledeći način:

Izvor slike: VMware

  • Izdavači šalju poruke na razmenu;
  • Razmena šalje poruke u redove i druge razmene;
  • Kada se poruka primi, RabbitMQ šalje potvrde pošiljaocima;
  • Potrošači održavaju stalne TCP veze sa RabbitMQ-om i izjavljuju koji red primaju;
  • RabbitMQ usmerava poruke potrošačima;
  • Potrošači šalju potvrde o uspešnom ili neuspešnom prijemu poruke;
  • Nakon uspešnog prijema, poruka se uklanja iz reda čekanja.

Apache Kafka

Apache Kafka je distribuirano rešenje za razmenu poruka otvorenog koda, koje je razvio LinkedIn u Scala programskom jeziku. Sposoban je za obradu i skladištenje poruka koristeći model izdavač-pretplatnik sa visokom skalabilnošću i performansama.

Da bi sačuvao primljene događaje ili poruke, distribuira teme među čvorovima koristeći particije. Kombinuje i obrasce izdavač-pretplatnik i šeme redova poruka, a takođe je odgovoran za obezbeđivanje redosleda poruka za svakog potrošača.

Kafka je specijalizovana za visoku propusnost podataka i nisko kašnjenje za obradu tokova podataka u realnom vremenu. Ovo se postiže izbegavanjem previše logike na strani servera (posrednika), kao i nekih specifičnih detalja implementacije.

Na primer, Kafka uopšte ne koristi RAM i odmah upisuje podatke u sistem datoteka servera. Pošto se svi podaci upisuju sekvencijalno, postižu se performanse čitanja i pisanja, koje su uporedive sa RAM memorijom.

Ovo su glavni Kafka koncepti koji ga čine skalabilnim, efikasnim i otpornim na greške:

Tema

Tema je način označavanja ili kategorizacije poruke; zamislite ormar sa 10 fioka; svaka fioka može biti tema, a ormar je platforma Apache Kafka, pa bi, pored kategorizacije grupisanih poruka, još jedna bolja analogija za temu bila predstavljena u relacionim bazama podataka.

Proizvođač

Proizvođač ili producent je entitet koji se povezuje na platformu za razmenu poruka i šalje jednu ili više poruka na određenu temu.

Potrošač

Potrošač je entitet koji se povezuje na platformu za razmenu poruka i koristi jednu ili više poruka o određenoj temi.

Posrednik (broker)

Koncept posrednika na Kafka platformi nije ništa drugo do sama Kafka, i ona je ta koja upravlja temama i definiše način čuvanja poruka, dnevnika itd.

Klaster

Klaster je skup posrednika koji komuniciraju jedni s drugima radi bolje skalabilnosti i tolerancije grešaka.

Dnevnik datoteka

Svaka tema čuva svoje zapise u formatu dnevnika, odnosno na strukturiran i sekvencijalan način; datoteka dnevnika je, dakle, datoteka koja sadrži informacije o temi.

Particije

Particije su slojevi particionisanja poruka unutar teme; ovo particionisanje obezbeđuje elastičnost, toleranciju grešaka i skalabilnost Apache Kafke, tako da svaka tema može imati više particija na različitim lokacijama.

Arhitektura Apache Kafka

Kafka je zasnovana na „push“ modelu za isporuku poruka. Koristeći ovaj model, poruke u Kafki se aktivno guraju potrošačima. Poruke se objavljuju na teme, koje su podeljene i raspoređene među različitim posrednicima u klasteru.

Potrošači se tada mogu pretplatiti na jednu ili više tema i primati poruke kada se one proizvedu na tim temama.

U Kafki, svaka tema je podeljena na jednu ili više particija. Događaji se upisuju u particiju.

Ako postoji više od jednog posrednika u klasteru, particije će biti ravnomerno raspoređene po svim posrednicima (koliko je to moguće), što će omogućiti skaliranje opterećenja pisanja i čitanja u jednoj temi na nekoliko posrednika istovremeno. Pošto je klaster, radi pomoću ZooKeeper-a za sinhronizaciju.

Prima, čuva i distribuira zapise. Zapis je podatak koji generiše neki sistemski čvor, a koji može biti događaj ili informacija. Šalje se u klaster, a klaster ga čuva u particiji teme.

Svaki zapis ima ofset sekvence, a potrošač može da kontroliše ofset koji koristi. Dakle, ako postoji potreba za ponovnom obradom teme, to se može uraditi na osnovu ofseta.

Izvor slike: Vikipedija

Logika, kao što je upravljanje ID-om poslednje pročitane poruke potrošača ili odluka o tome u koju particiju se upisuju novopristigli podaci, u potpunosti je prebačena na klijenta (proizvođača ili potrošača).

Pored koncepata proizvođača i potrošača, postoje i koncepti teme, particije i replikacije.

Tema opisuje kategoriju poruka. Kafka postiže toleranciju grešaka replikovanjem podataka u temi i skaliranjem particionisanjem teme na više servera.

RabbitMQ protiv Kafke

Glavne razlike između Apache Kafke i RabbitMQ-a proizlaze iz fundamentalno različitih modela isporuke poruka koji su implementirani u ovim sistemima.

Konkretno, Apache Kafka funkcioniše na principu „povlačenja“ (pull), kada sami potrošači dobijaju poruke koje su im potrebne iz teme.

RabbitMQ, s druge strane, implementira „push“ model, tako što šalje potrebne poruke primaocima. Zbog toga se Kafka razlikuje od RabbitMQ-a na sledeće načine:

#1. Arhitektura

Jedna od najvećih razlika između RabbitMQ-a i Kafke je razlika u arhitekturi. RabbitMQ koristi tradicionalnu arhitekturu reda poruka zasnovanu na posredniku, dok Kafka koristi arhitekturu distribuirane platforme za strimovanje.

Takođe, RabbitMQ koristi model isporuke poruka zasnovan na povlačenju, dok Kafka koristi model zasnovan na potiskivanju (push).

#2. Čuvanje poruka

RabbitMQ stavlja poruku u FIFO red (First Input – First Output) i prati status ove poruke u redu, a Kafka dodaje poruku u dnevnik (upisuje na disk), ostavljajući primaocu da se pobrine za dobijanje potrebnih informacija iz teme.

RabbitMQ briše poruku nakon što je isporučena primaocu, dok Kafka čuva poruku dok nije zakazana za čišćenje dnevnika.

Dakle, Kafka čuva trenutna i sva prethodna stanja sistema i može se koristiti kao pouzdan izvor istorijskih podataka, za razliku od RabbitMQ-a.

#3. Balansiranje opterećenja

Zahvaljujući modelu povlačenja isporuke poruka, RabbitMQ smanjuje kašnjenje. Međutim, moguće je da se primaoci preopterete ako poruke stižu u red brže nego što ih mogu obraditi.

Pošto u RabbitMQ-u svaki primalac zahteva/učitava različit broj poruka, distribucija posla može postati neujednačena, što će uzrokovati kašnjenje i gubitak redosleda poruka tokom obrade.

Da bi se ovo sprečilo, svaki RabbitMQ prijemnik konfiguriše ograničenje unapred preuzimanja, ograničenje broja akumuliranih nepriznatih poruka. U Kafki se balansiranje opterećenja vrši automatski preraspodelom primalaca po odeljcima (particijama) teme.

#4. Usmjeravanje (routing)

RabbitMQ uključuje četiri načina za usmeravanje do različitih čekaonica, omogućavajući moćan i fleksibilan skup obrazaca za razmenu poruka. Kafka implementira samo jedan način za pisanje poruka na disk bez usmeravanja.

#5. Redosled poruka

RabbitMQ omogućava da se održi relativni redosled u proizvoljnim skupovima (grupama) događaja, a Apache Kafka pruža jednostavan način za održavanje redosleda uz skalabilnost, pisanjem poruka uzastopno u replicirani dnevnik (temu).

Funkcija RabbitMQ Kafka
Arhitektura Čuva poruke na disku priključenom na posrednika Arhitektura distribuirane platforme za strimovanje
Model isporuke Zasnovan na povlačenju Zasnovan na potiskivanju
Čuvanje poruka Ne može sačuvati poruke Održava redosled pisanjem u temu
Balansiranje opterećenja Konfiguriše ograničenje unapred preuzimanja Izvodi se automatski
Usmjeravanje Uključuje porudžbine u 4 niza načina Uključuje samo usmjeravanje narudžbine na temu
Eksterni procesi Ne zahteva Zahteva pokretanje ZooKeeper instance
Dodaci Nekoliko dodataka Ima ograničenu podršku za dodatke

RabbitMQ i Kafka su široko korišćeni sistemi za razmenu poruka, svaki sa svojim prednostima i slučajevima upotrebe. RabbitMQ je fleksibilan, pouzdan i skalabilan sistem za razmenu poruka koji se ističe u čekanju poruka, što ga čini idealnim izborom za aplikacije koje zahtevaju pouzdanu i fleksibilnu isporuku poruka.

S druge strane, Kafka je distribuirana platforma za strimovanje koja je dizajnirana za obradu velikih količina podataka u realnom vremenu sa visokom propusnošću, što je čini odličnim izborom za aplikacije koje zahtevaju obradu i analizu podataka u realnom vremenu.

Glavni slučajevi upotrebe za RabbitMQ:

E-trgovina

RabbitMQ se koristi u aplikacijama za e-trgovinu za upravljanje protokom podataka između različitih sistema, kao što su upravljanje zalihama, obrada porudžbina i obrada plaćanja. Može da obradi velike količine poruka i osigura da se one isporučuju pouzdano i ispravnim redosledom.

Zdravstvena zaštita

U zdravstvenoj industriji, RabbitMQ se koristi za razmenu podataka između različitih sistema, kao što su elektronski zdravstveni kartoni (EHR), medicinski uređaji i sistemi za podršku kliničkom odlučivanju. Može pomoći u poboljšanju brige o pacijentima i smanjenju grešaka tako što će obezbediti da su prave informacije dostupne u pravo vreme.

Finansijske usluge

RabbitMQ omogućava razmenu poruka u realnom vremenu između sistema, kao što su platforme za trgovanje, sistemi za upravljanje rizikom i gejtveji za plaćanje. Može pomoći da se osigura da se transakcije obrađuju brzo i bezbedno.

IoT sistemi

RabbitMQ se koristi u IoT sistemima za upravljanje protokom podataka između različitih uređaja i senzora. Može pomoći da se podaci isporučuju bezbedno i efikasno, čak i u okruženjima sa ograničenim propusnim opsegom i povremenom vezom.

Kafka je distribuirana platforma za strimovanje dizajnirana da rukuje velikim količinama podataka u realnom vremenu.

Glavni slučajevi upotrebe za Kafku

Analitika u realnom vremenu

Kafka se koristi u analitičkim aplikacijama u realnom vremenu za obradu i analizu podataka dok se generišu, omogućavajući preduzećima da donose odluke na osnovu ažuriranih informacija. Može da rukuje velikim količinama podataka i obima kako bi zadovoljio potrebe čak i najzahtevnijih aplikacija.

Agregacija dnevnika

Kafka može da agregira evidencije iz različitih sistema i aplikacija, omogućavajući preduzećima da prate i rešavaju probleme u realnom vremenu. Takođe se može koristiti za čuvanje dnevnika za dugoročnu analizu i izveštavanje.

Mašinsko učenje

Kafka se koristi u aplikacijama za mašinsko učenje za strimovanje podataka u modele u realnom vremenu, omogućavajući preduzećima da naprave predviđanja i preduzmu akciju na osnovu ažuriranih informacija. Može pomoći u poboljšanju tačnosti i efikasnosti modela mašinskog učenja.

Moje mišljenje i o RabbitMQ-u i o Kafki

Loša strana RabbitMQ-ovih širokih i raznovrsnih mogućnosti za fleksibilno upravljanje redovima poruka je povećana potrošnja resursa i, shodno tome, degradacija performansi pod povećanim opterećenjem. Pošto je ovo način rada za složene sisteme, u većini slučajeva, Apache Kafka je najbolji alat za upravljanje porukama.

Na primer, u slučaju prikupljanja i agregiranja mnogih događaja iz desetina sistema i servisa, uzimajući u obzir njihovu geo-rezervaciju, metriku klijenta, datoteke evidencije i analitiku, sa perspektivom povećanja izvora informacija, radije bih koristio Kafku, međutim, ako ste u situaciji u kojoj vam treba samo brza razmena poruka, RabbitMQ će dobro obaviti posao!

Takođe možete pročitati kako da instalirate Apache Kafka u Windows i Linux.