Inleiding tot RabbitMQ

1. Overzicht

Ontkoppeling van softwarecomponenten is een van de belangrijkste onderdelen van softwareontwerp. Een manier om dit te bereiken is het gebruik van berichtensystemen, die een asynchrone manier van communicatie tussen componenten (services) bieden. In dit artikel behandelen we een van dergelijke systemen: RabbitMQ.

RabbitMQ is een message broker die Advanced Message Queuing Protocol (AMQP) implementeert. Het biedt clientbibliotheken voor de belangrijkste programmeertalen.

Naast het ontkoppelen van softwarecomponenten kan RabbitMQ worden gebruikt voor:

  • Achtergrondbewerkingen uitvoeren
  • Asynchrone bewerking uitvoeren

2. Berichtenmodel

Laten we eerst eens op hoog niveau kijken hoe berichten werken.

Simpel gezegd, er zijn twee soorten applicaties die communiceren met een berichtensysteem: producenten en consumenten. Producenten zijn degenen die berichten naar een makelaar sturen (publiceren) en consumenten die berichten van de makelaar ontvangen. Gewoonlijk draaien deze programma's (softwarecomponenten) op verschillende machines en RabbitMQ fungeert als een communicatie-middleware tussen hen.

In dit artikel bespreken we een eenvoudig voorbeeld met twee services die communiceren via RabbitMQ. Een van de services zal berichten naar RabbitMQ publiceren en de andere zal verbruiken.

3. Installatie

Laten we voor het begin RabbitMQ uitvoeren met behulp van de officiële installatiehandleiding hier.

We zullen natuurlijk de Java-client gebruiken voor interactie met de RabbitMQ-server; de Maven-afhankelijkheid voor deze client is:

 com.rabbitmq amqp-client 4.0.0 

Nadat we de RabbitMQ-makelaar hebben uitgevoerd met behulp van de officiële gids, moeten we er verbinding mee maken met behulp van de Java-client:

ConnectionFactory factory = nieuwe ConnectionFactory (); factory.setHost ("localhost"); Verbinding verbinding = factory.newConnection (); Kanaalkanaal = connection.createChannel (); 

Wij gebruiken de ConnectionFactory om de verbinding met de server tot stand te brengen, zorgt deze ook voor het protocol (AMQP) en authenticatie. Hier maken we verbinding met de server op localhost, kunnen we de hostnaam wijzigen door de setHost functie.

We kunnen gebruiken setPort om de poort in te stellen als de standaardpoort niet wordt gebruikt door de RabbitMQ-server; de standaardpoort voor RabbitMQ is 15672:

factory.setPort (15678);

We kunnen de gebruikersnaam en het wachtwoord instellen:

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

Verder zullen we deze verbinding gebruiken voor het publiceren en consumeren van berichten.

4. Producent

Overweeg een eenvoudig scenario waar een webapplicatie gebruikers in staat stelt nieuwe producten aan een website toe te voegen. Elke keer dat er een nieuw product wordt toegevoegd, moeten we een e-mail naar klanten sturen.

Laten we eerst een wachtrij definiëren:

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

Elke keer dat gebruikers een nieuw product toevoegen, zullen we een bericht in een wachtrij plaatsen:

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

Ten slotte sluiten we het kanaal en de verbinding:

kanaal.close (); connection.close ();

Dit bericht wordt gebruikt door een andere service, die verantwoordelijk is voor het verzenden van e-mails naar klanten.

5. Consument

Laten we eens kijken wat we aan de consumentenkant kunnen implementeren; we gaan dezelfde wachtrij declareren:

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

Hier is hoe we de consument definiëren die berichten uit de wachtrij asynchroon zal verwerken:

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

6. Conclusie

Dit eenvoudige artikel behandelde basisconcepten van RabbitMQ en besprak een eenvoudig voorbeeld om het te gebruiken.

De volledige implementatie van deze tutorial is te vinden in het GitHub-project.