Introduzione a RabbitMQ

1. Panoramica

Il disaccoppiamento dei componenti software è una delle parti più importanti della progettazione del software. Un modo per ottenere ciò è utilizzare i sistemi di messaggistica, che forniscono un modo asincrono di comunicazione tra i componenti (servizi). In questo articolo, tratteremo uno di questi sistemi: RabbitMQ.

RabbitMQ è un broker di messaggi che implementa il protocollo AMQP (Advanced Message Queuing Protocol). Fornisce librerie client per i principali linguaggi di programmazione.

Oltre a utilizzare per il disaccoppiamento dei componenti software, RabbitMQ può essere utilizzato per:

  • Esecuzione di operazioni in background
  • Esecuzione di un'operazione asincrona

2. Modello di messaggistica

Per prima cosa, diamo una rapida occhiata ad alto livello a come funziona la messaggistica.

In poche parole, esistono due tipi di applicazioni che interagiscono con un sistema di messaggistica: produttori e consumatori. I produttori sono coloro che invia (pubblica) messaggi a un broker e i consumatori che ricevono messaggi dal broker. Di solito, questi programmi (componenti software) vengono eseguiti su macchine diverse e RabbitMQ funge da middleware di comunicazione tra di loro.

In questo articolo, discuteremo un semplice esempio con due servizi che comunicheranno utilizzando RabbitMQ. Uno dei servizi pubblicherà messaggi su RabbitMQ e l'altro li consumerà.

3. Configurazione

Per l'inizio eseguiamo RabbitMQ utilizzando la guida di installazione ufficiale qui.

Naturalmente useremo il client Java per interagire con il server RabbitMQ; la dipendenza Maven per questo client è:

 com.rabbitmq amqp-client 4.0.0 

Dopo aver eseguito il broker RabbitMQ utilizzando la guida ufficiale, dobbiamo collegarci ad esso utilizzando il client java:

ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 

Usiamo ConnectionFactory per impostare la connessione con il server, si occupa anche del protocollo (AMQP) e dell'autenticazione. Qui ci colleghiamo al server su localhost , possiamo modificare il nome host utilizzando la funzione setHost .

Possiamo usare setPort per impostare la porta se la porta predefinita non è usata dal server RabbitMQ; la porta predefinita per RabbitMQ è 15672 :

factory.setPort(15678);

Possiamo impostare nome utente e password:

factory.setUsername("user1"); factory.setPassword("MyPassword");

Inoltre, useremo questa connessione per pubblicare e consumare messaggi.

4. Produttore

Si consideri uno scenario semplice in cui un'applicazione Web consente agli utenti di aggiungere nuovi prodotti a un sito Web. Ogni volta che viene aggiunto un nuovo prodotto, dobbiamo inviare un'e-mail ai clienti.

Per prima cosa, definiamo una coda:

channel.queueDeclare("products_queue", false, false, false, null);

Ogni volta che gli utenti aggiungono un nuovo prodotto, pubblicheremo un messaggio in una coda:

String message = "product details"; channel.basicPublish("", "products_queue", null, message.getBytes());

Infine, chiudiamo il canale e la connessione:

channel.close(); connection.close();

Questo messaggio verrà utilizzato da un altro servizio, responsabile dell'invio di e-mail ai clienti.

5. Consumatore

Vediamo cosa possiamo implementare dal lato consumer; dichiareremo la stessa coda:

channel.queueDeclare("products_queue", false, false, false, null);

Ecco come definiamo il consumatore che elaborerà i messaggi dalla coda in modo asincrono:

DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); // process the message } }; channel.basicConsume("products_queue", true, consumer);

6. Conclusione

Questo semplice articolo ha trattato i concetti di base di RabbitMQ e ha discusso un semplice esempio che lo utilizza.

L'implementazione completa di questo tutorial può essere trovata nel progetto GitHub.