Einführung in RabbitMQ

1. Übersicht

Die Entkopplung von Softwarekomponenten ist einer der wichtigsten Bestandteile des Software-Designs. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Nachrichtensystemen, die eine asynchrone Art der Kommunikation zwischen Komponenten (Diensten) bieten. In diesem Artikel werden wir eines dieser Systeme behandeln: RabbitMQ.

RabbitMQ ist ein Nachrichtenbroker, der das Advanced Message Queuing Protocol (AMQP) implementiert. Es bietet Client-Bibliotheken für die wichtigsten Programmiersprachen.

Neben der Verwendung zum Entkoppeln von Softwarekomponenten kann RabbitMQ verwendet werden für:

  • Hintergrundoperationen ausführen
  • Asynchronen Betrieb ausführen

2. Messaging-Modell

Lassen Sie uns zunächst einen kurzen Überblick über die Funktionsweise von Messaging geben.

Einfach ausgedrückt gibt es zwei Arten von Anwendungen, die mit einem Nachrichtensystem interagieren: Produzenten und Konsumenten. Produzenten sind diejenigen, die Nachrichten an einen Broker senden (veröffentlichen), und Verbraucher, die Nachrichten vom Broker erhalten. Normalerweise werden diese Programme (Softwarekomponenten) auf verschiedenen Computern ausgeführt und RabbitMQ fungiert als Kommunikations-Middleware zwischen ihnen.

In diesem Artikel werden wir ein einfaches Beispiel mit zwei Diensten diskutieren, die über RabbitMQ kommunizieren. Einer der Dienste veröffentlicht Nachrichten an RabbitMQ und der andere konsumiert.

3. Setup

Lassen Sie uns zunächst RabbitMQ mit der offiziellen Setup-Anleitung hier ausführen.

Wir werden natürlich den Java-Client für die Interaktion mit dem RabbitMQ-Server verwenden. Die Maven-Abhängigkeit für diesen Client lautet:

 com.rabbitmq amqp-client 4.0.0 

Nachdem Sie den RabbitMQ-Broker mithilfe des offiziellen Handbuchs ausgeführt haben, müssen Sie eine Verbindung mit dem Java-Client herstellen:

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

Wir verwenden die ConnectionFactory, um die Verbindung mit dem Server herzustellen. Sie kümmert sich auch um das Protokoll (AMQP) und die Authentifizierung. Hier stellen wir eine Verbindung zum Server auf localhost her . Wir können den Hostnamen mithilfe der Funktion setHost ändern .

Wir können setPort verwenden , um den Port festzulegen , wenn der Standardport nicht vom RabbitMQ-Server verwendet wird. Der Standardport für RabbitMQ ist 15672 :

factory.setPort(15678);

Wir können den Benutzernamen und das Passwort festlegen:

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

Außerdem werden wir diese Verbindung zum Veröffentlichen und Konsumieren von Nachrichten verwenden.

4. Produzent

Stellen Sie sich ein einfaches Szenario vor, in dem Benutzer mit einer Webanwendung einer Website neue Produkte hinzufügen können. Jedes Mal, wenn ein neues Produkt hinzugefügt wird, müssen wir eine E-Mail an die Kunden senden.

Definieren wir zunächst eine Warteschlange:

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

Jedes Mal, wenn Benutzer ein neues Produkt hinzufügen, veröffentlichen wir eine Nachricht in einer Warteschlange:

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

Zuletzt schließen wir den Kanal und die Verbindung:

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

Diese Nachricht wird von einem anderen Dienst verwendet, der für das Senden von E-Mails an Kunden verantwortlich ist.

5. Verbraucher

Mal sehen, was wir auf der Verbraucherseite implementieren können. Wir werden dieselbe Warteschlange deklarieren:

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

So definieren wir den Verbraucher, der Nachrichten aus der Warteschlange asynchron verarbeitet:

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. Fazit

Dieser einfache Artikel behandelte grundlegende Konzepte von RabbitMQ und diskutierte ein einfaches Beispiel, das es verwendet.

Die vollständige Implementierung dieses Tutorials finden Sie im GitHub-Projekt.