Einführung in RabbitMQ

Einführung in RabbitMQ

1. Überblick

Die Entkopplung von Softwarekomponenten ist einer der wichtigsten Bestandteile des Software-Designs. Eine Möglichkeit, dies zu erreichen, besteht in der Verwendung von Nachrichtensystemen, die eine asynchrone Art der Kommunikation zwischen Komponenten (Diensten) bereitstellen. 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 zur Entkopplung von Softwarekomponenten kann RabbitMQ eingesetzt werden für:

  • Durchführen von Hintergrundoperationen

  • Asynchrone Operation 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 Konsumenten, die Nachrichten vom Broker empfangen. Normalerweise laufen diese Programme (Softwarekomponenten) auf verschiedenen Rechnern und RabbitMQ fungiert als Kommunikations-Middleware zwischen ihnen.

In diesem Artikel werden wir ein einfaches Beispiel mit zwei Diensten diskutieren, die mit RabbitMQ kommunizieren. Einer der Dienste wird Nachrichten an RabbitMQ veröffentlichen und der andere wird Nachrichten verbrauchen.

3. Konfiguration

Lassen Sie uns zunächst RabbitMQ mit dem offiziellen Setup-Handbuchhere ausführen.

Wir werden den Java-Client natürlich für die Interaktion mit dem RabbitMQ-Server verwenden. DieMaven dependency für diesen Client sind:


    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 verwendenConnectionFactory, um die Verbindung mit dem Server herzustellen. Es kümmert sich auch um das Protokoll (AMQP) und die Authentifizierung. Hier stellen wir überlocalhost eine Verbindung zum Server her. Wir können den Hostnamen mithilfe der FunktionsetHost ändern.

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

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

Consider a simple scenario, bei denen 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 zuständig 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:

Consumer 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 erläuterte ein einfaches Beispiel für dessen Verwendung.

Die vollständige Implementierung dieses Tutorials finden Sie inthe GitHub project.