RabbitMQ: Spedizione rapida di messaggi

Nel settore informatico, i messaggi vengono trasmessi da un servizio all’altro in maniera continua. Tali trasmissioni devono essere monitorate, altrimenti i messaggi si bloccano a vicenda, provocando intoppi e ostacolando lo svolgimento ottimale dei processi. Per garantire una comunicazione agevole tra le applicazioni, è consigliabile attivare un programma intermedio, ossia un servizio che si occupi della distribuzione di messaggi. Tale servizio viene chiamato broker di messaggistica. Qui vi presentiamo uno dei più famosi: RabbitMQ.

Cos’è RabbitMQ?

RabbitMQ si basa su un principio di Advanced Message Queuing Protocols (AMQP). Il grande vantaggio dell’AMQP: mittente e destinatario non devono comprendere lo stesso linguaggio di programmazione. Nell’ultimo periodo, i broker di messaggistica si sono distaccati un po’ dal protocollo AMQP e grazie ai plug-in funzionano anche con altri protocolli di messaggi come STOMP o MQTT. Il principio di base però resta lo stesso: tra il produttore e il consumatore di un messaggio c’è una coda. È qui che vengono depositati i messaggi.

Fatto

In questo contesto, il termine “messaggio” viene utilizzato in modo molto ampio. Per messaggi si intendono disposizioni ad altri programmi, ma anche effettivi messaggi di testo. Qualsiasi forma di trasmissione di informazioni può svolgersi tramite RabbitMQ o altri broker di messaggi.

Il vantaggio di RabbitMQ è che il produttore del messaggio non deve occuparsi anche della sua trasmissione. Il broker di messaggistica consegna il messaggio permettendo al produttore di cominciare un nuovo incarico. Il mittente, dunque, non deve attendere la ricezione del messaggio da parte del destinatario. In processi di questo tipo il messaggio si trova in coda e può essere prelevato dal consumatore. Quando ciò avverrà, il mittente sarà già impegnato con un nuovo incarico. Si tratta dunque di un processo asincrono: mittente e destinatario non devono agire allo stesso ritmo.

Il processo con RabbitMQ:

La trasmissione di un messaggio richiede quattro elementi:

  • Producer: crea messaggi
  • Exchange: inoltra i messaggi
  • Queue: deposita i messaggi
  • Consumer: rielabora il messaggio

Il producer pubblica un messaggio, ma non lo invia direttamente al consumer, perché lo trasmette all’exchange. Questo elemento è responsabile di inoltrare i messaggi a diverse code. Di queste si servono poi i consumer con i messaggi. Sia l’elemento exchange che la queue sono parti di RabbitMQ e vengono amministrati dal software. Per garantire che i messaggi raggiungano i destinatari corretti, si utilizzano le routing key. Il mittente dà al messaggio una routing key, che funziona come un indirizzo. Con l’ausilio di una chiave, l’exchange è in grado di riconoscere come indirizzare il messaggio.

Tra l’exchange e la queue si trova il cosiddetto binding. Attraverso di esso ogni singola coda viene collegata all’exchange. Inoltre il binding definisce i criteri con cui un messaggio deve essere inoltrato. Esistono quattro diversi tipi di distribuzione di un messaggio.

Direct Exchange

Un Direct Exchange è un collegamento diretto tra mittente e destinatario. Il producer fornisce il messaggio con una routing key, che corrisponde alla relativa binding key della coda. Ciò significa che entra in gioco una sola coda, a cui di solito corrisponde un consumer.

Topic Exchange

Questo tipo di exchange amplia il concetto di direct exchange. Qui non è solo un criterio (Routing Key = Binding Key) ma più code ad entrare in gioco. Funziona attraverso un metacarattere. Così possono essere accettate diverse code, ossia binding key, mentre altre restano escluse.

Fanout Exchange

La fanout exchange è una lista broadcast. Si inoltra un messaggio a tutte le possibili code. Non avviene alcun tipo di selezione. Si ignora una routing key.

Header Exchange

Anche nel caso di un header exchange il sistema ignora una routing key. Al suo posto è l’header a svolgere un ruolo fondamentale. Qui l’elemento exchange trova gli attributi, necessari per indirizzare le code corrette. In un certo modo un header exchange funziona in maniera analoga ad un topic exchange, poiché anche in questo caso vengono coinvolte molte code, ma non tutte.

I Consumer, e cioè i software destinatari, si registrano in code precise per potersi riferire ai messaggi. Perciò è previsto un Consumer per coda. Se più consumer prendono messaggi dalla stessa coda, non è possibile garantire la loro corretta distribuzione. Si decide in maniera facoltativa per ogni messaggio, se il destinatario deve riconoscerne il contenuto o se questo non è necessario.

RabbitMQ nell’utilizzo

RabbitMQ è un server open source scritto in Erlang e può essere scaricato dal sito ufficiale nella versione per Linux, BSD, Unix, Windows e macOS. Si consiglia inoltre l’utilizzo di plug-in, che semplificano il lavoro con il broker di messaggistica ampliandone le funzionalità. Per prima cosa deve essere presente il plug-in Management, che è compreso nell’installazione standard ma deve essere attivato. Grazie alla sua interfaccia grafica gli utenti possono amministrare RabbitMQ, avere una panoramica dei messaggi in coda e visualizzare le statistiche.

A tal proposito può essere molto importante il plug-in Shovel: questo permette di collegare due istanze broker tra loro. Ciò si rivela utile, ad esempio, per distribuire meglio il carico. Inoltre, in questo modo, si spostano i dati sensibili o molto voluminosi, anche per motivi di sicurezza, in una rete completamente diversa.

La comunicazione funziona tramite TCP, per il quale RabbitMQ necessita di porte. Queste non possono essere chiuse né bloccate da altre applicazioni. Una lista di tutte le porte si trova nella documentazione di RabbitMQ.

In sintesi

RabbitMQ convince gli utenti soprattutto per la sua struttura leggera. È un broker di messaggi semplice da impostare e può essere utilizzato in molte situazioni. In scenari più grandi, gli sviluppatori e gli admin preferiscono piuttosto ricorrere a Apache Kafka.


Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.