Apache Kafka vs RabbitMQ

Apache Kafka vs RabbitMQ

Quando si sceglie un sistema di messaggistica, la decisione solitamente si riduce a Apache Kafka vs RabbitMQ. Sia se vogliamo implementare un broker di messaggi per i nostri microservizi, elaborando flussi di dati in tempo reale o progettando un’architettura pub-sub, RabbitMQ e Kafka saranno molto probabilmente le due scelte principali.

Le piattaforme offrono funzionalità sovrapposte ma hanno architetture e approcci di messaggistica diversi. A seconda del caso d’uso, una potrebbe essere più adatta dell’altra.

Il seguente articolo confronterà Apache Kafka vs RabbitMQ in diversi ambiti, tra cui architettura, funzionalità, messaggistica, prestazioni, scalabilità, sicurezza e monitoraggio.

Che cos’è RabbitMQ?
RabbitMQ è un broker di messaggi che supporta diversi protocolli di messaggistica, tra cui AMQP, STOMP, MQTT e flussi RabbitMQ. Consente inoltre di creare un sistema di messaggistica tramite HTTP e WebSocket.

RabbitMQ offre un meccanismo di messaggistica robusto e configurabile. È possibile rendere durevole una coda di messaggi, il che assicura che conserverà i dati anche se un broker viene riavviato. È possibile renderla esclusiva, il che lega la coda a una connessione e la elimina quando la connessione muore. Diverse altre configurazioni, tra cui TTL (time to live) della coda, limite di lunghezza e priorità dei consumatori, consentono di implementare diversi casi d’uso di messaggistica.

Altre caratteristiche chiave includono la consegna affidabile, la conferma dei messaggi, molteplici tipi di scambio, distribuzione distribuita, monitoraggio nativo tramite dashboard e CLI e replica della coda.

RabbitMQ è la soluzione ideale per qualsiasi caso d’uso che richieda messaggistica affidabile, flessibile e sicura tra diverse entità, ad esempio elaborazione di messaggi asincroni, sistemi pub-sub e comunicazione tra processi tra applicazioni.

Che cos’è Apache Kafka?
Nel suo nucleo, Apache Kafka è una piattaforma di streaming di eventi che può essere utilizzata per archiviare, trasferire ed elaborare dati di grandi volumi basati su eventi. Offre elaborazione di flussi integrata con funzionalità come trasformazioni, join, filtri e altro ancora.

Kafka è progettato per archiviare e fornire accesso a grandi volumi di dati con un overhead minimo. Un broker rappresenta l’elemento primario del livello di archiviazione di Kafka. Kafka suddivide e distribuisce i dati tra broker, che possono esistere su nodi diversi.

Le caratteristiche principali di Kafka includono l’integrazione immediata con centinaia di fonti di dati, l’ordinamento garantito, la perdita di messaggi pari a zero, il mirroring dei dati tra cluster e la replicazione configurabile dei dati.

Kafka è la scelta ideale per i casi d’uso che richiedono la raccolta, l’archiviazione e l’elaborazione di messaggi di evento, ad esempio aggregazione di log, applicazioni basate su eventi, analisi dei dati in tempo reale, elaborazione delle transazioni in tempo reale, pipeline di elaborazione dei dati e sistemi pub-sub.

Apache Kafka vs RabbitMQ
Nelle sezioni seguenti confronteremo Apache Kafka vs RabbitMQ in diversi ambiti di rilevanza.

Architettura
RabbitMQ
Nel mondo RabbitMQ, i publisher/producer sono applicazioni che pubblicano messaggi su uno scambio. Lo scambio è responsabile dell’instradamento di questi messaggi su code diverse in base a un concetto noto come binding. Un binding rappresenta la relazione tra una coda e uno scambio. Affinché una coda possa ricevere messaggi da uno scambio, deve essere esplicitamente vincolata a esso.

I consumer sono entità che consumano dati da una coda in uno dei due modi. Possono iscriversi a una coda, nel qual caso i messaggi vengono loro recapitati automaticamente (approccio basato su push), oppure possono estrarre dati da una coda ogni volta che è necessario (approccio basato su pull).

RabbitMQ supporta sia la comunicazione sincrona che quella asincrona. È anche possibile implementare un modello Remote Procedure Call (RPC). RPC consente di implementare un modello di richiesta-risposta asincrono in cui i publisher si aspettano una risposta dal consumer ma non sono bloccati su di essa.

La struttura dati Streams può essere utilizzata per archiviare dati per l’elaborazione in tempo reale o successiva in modo affidabile. Streams è una buona soluzione quando molti consumatori vogliono consumare dati dalla stessa coda o quando potrebbe essere necessario mettere in coda grandi quantità di dati.

Apache Kafka
Nell’architettura Kafka, un produttore è un’entità che scrive messaggi di evento. Questi messaggi sono categorizzati come argomenti. Gli argomenti sono divisi in partizioni, che possono esistere su diversi broker Kafka. Un broker è un server autonomo che archivia i dati sul file system.

Suddividendo gli argomenti in un numero configurabile di partizioni, Kafka raggiunge alti livelli di affidabilità e scalabilità. Un produttore Kafka si connette a un broker per pubblicare messaggi di evento. I produttori possono scegliere di scrivere dati su una partizione specifica o su partizioni diverse. Kafka si assume la responsabilità di garantire che l’ordine e l’integrità dei messaggi siano preservati.

I consumer si collegano ai broker per estrarre dati da diversi argomenti. I consumatori Kafka hanno la flessibilità di scegliere tra elaborazione batch o in tempo reale dei messaggi di evento. A differenza di RabbitMQ, Kafka non offre un approccio basato su push in cui i messaggi vengono recapitati direttamente ai consumer.

Caratteristiche
RabbitMQ
RabbitMQ offre numerose funzionalità che consentono agli utenti di soddisfare un’ampia gamma di casi d’uso:

  • Code quorum : la coda quorum è una forma evoluta di una coda RabbitMQ che implementa una replica efficiente. Ogni coda quorum ha una replica primaria (leader) e zero o più repliche secondarie. Se un nodo contenente un leader di coda va giù, viene automaticamente eletto un nuovo leader. Utilizzando l’algoritmo di consenso Raft, le code quorum garantiscono la sicurezza e l’integrità dei dati.
  • Multiprotocollo : RabbitMQ fornisce supporto multiprotocollo. RabbitMQ ti consente di usare il tuo protocollo preferito per creare un meccanismo di messaggistica. Puoi usare vari tipi di AMQP per una potente semantica di messaggistica, STOMP per la facilità d’uso, MQTT per sistemi pub/sub leggeri, Stream per l’elaborazione di flussi o HTTP semplice per la massima interoperabilità. Al contrario, Kafka supporta solo il suo protocollo binario nativo basato su TCP.
  • Code di lavoro (note anche come code di attività) : le code di lavoro vengono utilizzate per scaricare attività I/O intensive su processi worker dedicati. Invece di eseguire un’attività complicata e dispendiosa in termini di tempo nel thread del processo principale, possiamo inserirla in una coda di lavoro e attendere che termini. Questa è una tecnica di ottimizzazione utile per le applicazioni che hanno una finestra di risposta breve. Un’applicazione incapsula un’attività come messaggio prima di aggiungerla a una coda. I processi worker dedicati estraggono i messaggi da una coda ed eseguono le attività. Se vengono creati più worker, le attività vengono distribuite tra di loro.
  • Tracciamento : RabbitMQ offre anche una funzionalità, il Firehose tracer, per abilitare il tracciamento su base per nodo o per host virtuale. Una volta abilitato, tutti i messaggi successivi vengono inoltre pubblicati su uno scambio dedicato al tracciamento. Gli amministratori possono associare le code a questo scambio e monitorare tutte le attività in rete. L’abilitazione di Firehose influisce sulle prestazioni man mano che vengono creati e pubblicati messaggi aggiuntivi.
  • Estensibilità : RabbitMQ è open source e supporta plugin. Puoi estendere le funzionalità principali installando plugin per supporto protocollo aggiuntivo, federazione nodi e monitoraggio. Se hai esigenze personalizzate, puoi anche scrivere il tuo plugin.

Apache Kafka

Alcune delle funzionalità più utili di Apache Kafka includono:

  • Replica configurabile : Kafka implementa la replica tramite un parametro configurabile noto come fattore di replica. Ogni partizione Kafka ha un leader e 0 o più follower. Un broker contenente una partizione leader è noto come broker leader. Un broker contenente una partizione follower è chiamato broker follower. I produttori scrivono sempre nuovi messaggi a un broker leader, propagandoli ai suoi follower. Se un broker leader si blocca, un broker controller elegge un nuovo leader.
  • Kafka streams : Kafka offre potenti capacità di streaming integrate. Puoi elaborare flussi di eventi ad alto volume utilizzando filtri, trasformazioni, join, aggregazioni e altro. L’elaborazione esattamente una volta assicura che un record venga elaborato una sola volta. Ciò garantisce un throughput elevato. L’elaborazione di un record alla volta offre una latenza di elaborazione di millisecondi. Kafka Streams è progettato come una libreria client leggera che può essere integrata con qualsiasi app Java.
  • Connect API : Connect API offre un’integrazione immediata con diverse origini dati ed eventi, tra cui Postgres, JMS, AWS S3, Elasticsearch, MySQL e altro. Puoi anche utilizzarla per l’integrazione con origini non supportate.
  • Archiviazione distribuita e permanente : Kafka surclassa RabbitMQ nel reparto persistenza. Anche se un RabbitMQ Stream offre un modo per rendere persistenti dati di grandi volumi, non si avvicina alle capacità di archiviazione distribuita e tollerante ai guasti di Kafka. Nonostante l’archiviazione dei dati sul file system, Kafka riesce a fornire alti livelli di prestazioni.
  • Estensibilità : poiché Kafka è open source, può essere esteso per soddisfare esigenze aziendali personalizzate.


Prestazioni e scalabilità
RabbitMQ
Nella maggior parte delle circostanze, Kafka offre una produttività migliore di RabbitMQ. RabbitMQ può elaborare decine di migliaia di messaggi al secondo, mentre Kafka può essere scalato per gestirne milioni.

RabbitMQ offre diverse opzioni di distribuzione distribuita, che contribuiscono alla sua elevata disponibilità e affidabilità. Il plugin Federation aiuta a distribuire i messaggi tra diverse istanze di RabbitMQ senza la necessità di clustering.

Il clustering RabbitMQ è un ottimo modo per raggruppare nodi e scalare. Un cluster RabbitMQ può essere creato tramite un file di configurazione, scoperta Kubernetes, scoperta basata su DNS e scoperta basata su etcd.

Apache Kafka
Un chiaro vantaggio di Kafka rispetto a RabbitMQ è che offre un throughput elevato durante l’archiviazione di dati su larga scala. Al contrario, le code di RabbitMQ sono più veloci quando sono vuote perché non sono progettate per conservare grandi volumi di dati indefinitamente.

È possibile scalare un cluster Kafka aggiungendo nuovi broker o nodi. Kafka offre anche la possibilità di distribuire i cluster su diverse zone di disponibilità e di connettere cluster distribuiti su diverse zone geografiche.

Messaggistica
RabbitMQ
Un messaggio in RabbitMQ può contenere diversi attributi, tra cui tipo di contenuto, codifica del contenuto, modalità di recapito, chiave di routing, ID dell’applicazione dell’editore, timestamp di pubblicazione del messaggio, periodo di scadenza, priorità e altro ancora.

RabbitMQ ha un modello di messaggistica flessibile. Ad esempio, gli utenti possono scegliere tra i seguenti tipi di scambio per soddisfare diversi casi d’uso:

  • Scambio diretto : questo scambio recapita i messaggi alle code in base alla chiave di routing del messaggio.
  • Fanout exchange : uno scambio fanout indirizza tutti i messaggi a tutte le code ad esso collegate. Ignora le chiavi di routing.
  • Scambio di argomenti : gli scambi di argomenti instradano i messaggi quando esiste una corrispondenza tra la chiave di routing e il modello specificato durante l’associazione di una coda.
  • Scambio di intestazioni : questo tipo di scambio instrada i messaggi in base ai diversi attributi specificati come intestazioni in un messaggio.


Per garantire una consegna affidabile, RabbitMQ rimuove un messaggio da una coda solo dopo che il consumatore ne ha confermato la ricezione. Se un messaggio non riesce a essere instradato, RabbitMQ può restituirlo al publisher. Il publisher può scegliere come reagire in caso di errore. Se l’elaborazione del messaggio fallisce sul lato del consumatore, il consumatore può avvisare RabbitMQ e chiedere di eliminarlo o rimetterlo in coda.

Apache Kafka
Un tipico messaggio di evento in Kafka è costituito da una chiave, un valore, un timestamp, metadati, intestazioni, partizione e offset e tipo di compressione. Rispetto a RabbitMQ, Kafka offre un supporto limitato per la definizione di strategie di routing personalizzate.

Possiamo usare l’hashing delle chiavi per assicurarti che i messaggi con la stessa chiave finiscano sempre nella stessa partizione-argomento. Se non specifichi una chiave, Kafka usa la tecnica round-robin per distribuire equamente le chiavi tra le partizioni. Un’altra opzione è implementare il routing dinamico usando flussi Kafka per instradare i messaggi di evento verso gli argomenti. Ma per quanto riguarda il supporto al routing integrato, ce n’è poco o niente.

Per consentire a Kafka di tracciare i messaggi elaborati, i consumatori devono periodicamente eseguire offset, noti come offset dei consumatori. Poiché questo potrebbe essere un processo manuale, è soggetto a errori da parte dell’utente. Se viene eseguito un offset non corretto, l’integrità dell’intero sistema può essere compromessa. Al contrario, RabbitMQ traccia automaticamente i messaggi consumati e confermati.

Sicurezza
RabbitMQ
RabbitMQ offre diversi controlli di sicurezza e configurazioni che possono essere utilizzati per proteggere un’istanza da accessi non autorizzati. Viene fornito con tre meccanismi di autenticazione SASL: PLAIN, AMQPLAIN e RABBIT-CR-DEMO. Meccanismi aggiuntivi possono essere abilitati tramite plugin.

L’autorizzazione regola quali utenti possono accedere a quali risorse, presentarsi all’interno di quale host virtuale ed eseguire quali operazioni. Le operazioni consentite sono configure, write e read. L’autorizzazione può essere applicata anche a livello di argomento.

RabbitMQ fornisce anche supporto TLS integrato. TLS può essere utilizzato per crittografare le connessioni client e le connessioni inter-nodo ed eseguire la verifica peer. RabbitMQ non offre crittografia a riposo.

Apache Kafka
Le operazioni di lettura/scrittura da parte dei client sui broker possono essere autorizzate. È anche possibile integrare con un modulo di autorizzazione di terze parti per l’autorizzazione. Rispetto a RabbitMQ, Kafka offre una flessibilità leggermente inferiore per quanto riguarda l’autorizzazione.

I dati trasferiti tra broker e tra un broker e i suoi clienti possono essere crittografati anche tramite SSL. Kafka non offre nemmeno la crittografia a riposo.

Gestione, manutenzione e monitoraggio
RabbitMQ
RabbitMQ offre diversi modi per gestire e monitorare nodi e cluster . L’API HTTP può essere utilizzata per recuperare a livello di programmazione varie metriche di performance relative a cluster, produttori, consumatori, connessioni, code e altro. Diversi sistemi di monitoraggio, tra cui Prometheus, possono integrarsi con l’API e visualizzare le metriche in tempo reale.

L’interfaccia utente basata sul Web intuitiva offre diverse funzionalità agli amministratori relative a connessioni, scambi, code, canali e altro. Possono aggiungere o eliminare code o scambi, monitorare la velocità dei messaggi, inviare e ricevere messaggi, modificare policy e impostazioni di runtime, eliminare code e forzare la chiusura delle connessioni con i client.

È possibile utilizzare anche uno strumento da riga di comando, rabbitmqadmin, per eseguire alcune attività amministrative, come elencare scambi, code o utenti, ottenere una panoramica dello stato di integrità dell’istanza, pubblicare e ricevere messaggi, eliminare le code e forzare la chiusura delle connessioni client.

Apache Kafka
Kafka espone metriche di performance chiave tramite JMX. Jolokia, un bridge HTTP-JMX, può essere utilizzato per recuperare queste metriche per aggregazione e analisi. Jolokia non fa parte del core di Kafka, ma può essere caricato e abilitato in modo nativo. JMX espone metriche relative a nodi, produttori, consumatori, connessioni e flussi.

A differenza di RabbitMQ, Kafka non contiene strumenti integrati per la gestione e il monitoraggio . Tuttavia, ci sono diversi strumenti di terze parti, sia open source che commerciali, che possono essere utilizzati per questi scopi.

Supporto per piattaforme, linguaggi e librerie
RabbitMQ
RabbitMQ è ufficialmente supportato su tutti i principali sistemi operativi, inclusi Linux, Windows, Windows Server e macOS. Le librerie client esistono per diversi linguaggi di programmazione e framework, inclusi Java, Spring, C++, .NET, Ruby, Python e PHP.

Numerosi moduli, adattatori e plugin sono supportati dalla community e dal team RabbitMQ. RabbitMQTools, ad esempio, è un modulo PowerShell per gestire RabbitMQ, Celery è una coda di task distribuita per Python e Django e amqp-client è un client basato su TypeScript per NodeJS.

RabbitMQ Cluster Kubernetes Operator può essere utilizzato per effettuare il provisioning e gestire automaticamente i pod RabbitMQ in esecuzione in un cluster Kubernetes.

Apache Kafka
Sebbene Kafka sia ottimizzato per sistemi basati su Linux, può essere eseguito su qualsiasi sistema operativo che supporti Java Virtual Machine (JVM). Esistono librerie client per Java, Scala, Python, Go, C/C++, Node.js, .NET e altro ancora.

Sono disponibili diversi plugin integrati e della community, tra cui connettori per flussi di file, S3, IBM MQ, HDFS, Elasticsearch, ActiveMQ, JDBC e altro. Anche se Kafka non offre alcun supporto integrato per Kubernetes, è possibile eseguire cluster Kafka all’interno di Kubernetes.

Quando usare quale
Apache Kafka vs RabbitMQ sono entrambe piattaforme stabili, tolleranti ai guasti e ricche di funzionalità. Tuttavia, ci sono casi d’uso in cui una potrebbe essere più adatta dell’altra.

Utilizzare Apache Kafka se vogliamo:

  • Acquisire, archiviare ed elaborare flussi di eventi.
  • Elaborare milioni di richieste al secondo.
  • Eseguire analisi dei dati con funzionalità native di elaborazione dei flussi.
  • Implementare un approccio di consumo basato sul pull.
  • Creare applicazioni basate su trigger, a bassa latenza e guidate da eventi.


Utilizzare RabbitMQ se vogliamo:

  • Costruire un meccanismo pub-sub tradizionale.
  • Utilizzare diverse tecniche di instradamento dei messaggi.
  • Implementare la comunicazione interprocesso per i microservizi.
  • Utilizzare funzionalità di messaggistica non presenti in Kafka, come l’ordinamento, la priorità e la rimessa in coda.
  • Utilizzare un protocollo di messaggistica specifico.
  • Accedere ad approcci di consumo sia push che pull.


Conclusione Apache Kafka vs RabbitMQ
Apache Kafka vs RabbitMQ sono due ottime scelte per la creazione di infrastrutture di messaggistica. Ognuna ha diversi punti di forza e alcune debolezze. In questo articolo, abbiamo esplorato come le due piattaforme si comportano l’una contro l’altra in diversi reparti.

(fonte)

Innovaformazione, scuola informatica specialistica promuove la cultura dello sviluppo software in maniera consapevole. Promuoviamo la formazione dei team di sviluppatori per preparare i tecnici delle aziende alle sfide tecnologiche moderne.

Nell’offerta formativa trovate i corsi:

Corso Apache Kafka

Corso Microservices Asp.net e RabbitMQ

INFO: info@innovaformazione.net – Tel. 3471012275 (Dario Carrassi)

Ti potrebbe interessare

Articoli correlati