RabbitMQ: Erste Schritte

Wie Sie Stackhero für RabbitMQ nutzen

Im Folgenden zeigen wir Ihnen, wie Sie Ihre Python-Anwendung mit RabbitMQ verbinden, indem Sie die Aio Pika Bibliothek verwenden. In den meisten Fällen müssen Sie lediglich die AMQPS-URL für eine sichere Verbindung angeben:

connection = await aio_pika.connect_robust(
  "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)

Hier ein vollständiges Beispiel, das zeigt, wie Sie eine sichere Verbindung zu RabbitMQ aufbauen, einen Channel erstellen und eine einfache Queue deklarieren. Dies ist eine gute Möglichkeit, Ihre Konfiguration zu überprüfen:

import asyncio
import logging
import aio_pika

async def main() -> None:
    # Wenn Sie Debug-Logs sehen möchten, können Sie die nächste Zeile auskommentieren
    # logging.basicConfig(level=logging.DEBUG)

    connection = await aio_pika.connect_robust(
        "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"
    )

    async with connection:
        print("The connection worked!")
        channel = await connection.channel()
        await channel.set_qos(prefetch_count=10)
        queue = await channel.declare_queue("test_queue", auto_delete=True)

if __name__ == "__main__":
    asyncio.run(main())

Wenn Sie beim Verbindungsaufbau mit Python folgenden Fehler erhalten:

aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)

bedeutet dies in der Regel, dass auf Ihrem System das Let's Encrypt CA-Zertifikat fehlt. Um das Problem zu beheben, installieren Sie das CA-Zertifikate-Paket für Ihr Betriebssystem:

  1. Unter Ubuntu/Debian können Sie folgenden Befehl ausführen:

    sudo apt install ca-certificates
    
  2. Unter Alpine Linux führen Sie aus:

    apk add ca-certificates
    

Falls Sie diese Befehle nicht nutzen können, besteht die Möglichkeit, das CA-Zertifikat manuell zu installieren:

  1. Laden Sie das Let's Encrypt CA-Zertifikat von https://letsencrypt.org/certs/isrgrootx1.pem herunter.

  2. Anschließend können Sie in Ihrem Python-Code die Verbindung zu RabbitMQ herstellen, indem Sie die CA-Zertifikatdatei angeben:

    import ssl
    
    ssl_context = ssl.create_default_context()
    ssl_context.load_verify_locations(cafile='isrgrootx1.pem')
    
    connection = await aio_pika.connect_robust(
      "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
      ssl_context=ssl_context
    )
    

Hier ein vollständiges Beispiel, wie Sie das Let's Encrypt CA-Zertifikat für sichere Verbindungen nutzen:

import asyncio
import logging
import ssl
import aio_pika

async def main() -> None:
    # Um Debug-Logs zu aktivieren, können Sie diese Zeile auskommentieren
    # logging.basicConfig(level=logging.DEBUG)

    ssl_context = ssl.create_default_context()
    # Laden Sie das heruntergeladene Let's Encrypt CA-Zertifikat
    # Zum Beispiel: wget https://letsencrypt.org/certs/isrgrootx1.pem
    ssl_context.load_verify_locations(cafile='isrgrootx1.pem')

    connection = await aio_pika.connect_robust(
        "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
        ssl_context=ssl_context
    )

    async with connection:
        print("The connection worked!")
        channel = await connection.channel()
        await channel.set_qos(prefetch_count=10)
        queue = await channel.declare_queue("test_queue", auto_delete=True)

if __name__ == "__main__":
    asyncio.run(main())

Wenn Sie mit einer Go-Anwendung eine Verbindung zu RabbitMQ herstellen möchten, ist dies mit der offiziellen Go RabbitMQ Client Library sehr einfach. So können Sie starten:

  1. Erstellen Sie ein neues Verzeichnis und initialisieren Sie Ihr Go-Modul:
go mod init rabbitmq-example
  1. Fügen Sie anschließend die RabbitMQ-Bibliothek zu Ihrem Projekt hinzu:
go get github.com/rabbitmq/amqp091-go
  1. Erstellen Sie nun eine Datei mit dem Namen main.go und fügen Sie folgenden Code ein:

    package main
    
    import (
      "fmt"
      amqp "github.com/rabbitmq/amqp091-go"
    )
    
    func main() {
      connection, err := amqp.Dial("amqps://<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>")
      if err != nil {
        panic(err)
      }
      defer connection.Close()
    
      fmt.Println("Successfully connected to RabbitMQ instance")
    }
    
  2. Sie können Ihren Code mit folgendem Befehl ausführen:

go run main.go

Wenn die Verbindung erfolgreich ist, sehen Sie die Meldung "Successfully connected to RabbitMQ instance". Das bedeutet, dass Sie sicher mit Authentifizierung und TLS-Verschlüsselung verbunden sind.

Für weiterführende Beispiele empfiehlt sich ein Blick in die Go-Beispiele im offiziellen RabbitMQ-Repository: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.

Wenn Sie mit PHP arbeiten, können Sie die php-amqplib Bibliothek nutzen, um sich mit Ihrer RabbitMQ-Instanz zu verbinden. Da Stackhero TLS-Verschlüsselung (SSL) verwendet, empfiehlt es sich, AMQPSSLConnection zu verwenden:

use PhpAmqpLib\Connection\AMQPSSLConnection;

$connection = new AMQPSSLConnection(
  '<XXXXXX>.stackhero-network.com',
  <AMQP_PORT_TLS>,
  'admin',
  '<PASSWORD>',
  '/',
  array()
);

/**
 * @param \PhpAmqpLib\Connection\AbstractConnection $connection
 */
function shutdown($connection)
{
  $connection->close();
}

register_shutdown_function('shutdown', $connection);

In manchen Fällen benötigt Ihre TLS-Verbindung ein Certificate Authority (CA) Zertifikat. Viele Systeme bringen dieses bereits mit, Sie können es aber bei Bedarf auch manuell herunterladen. So gehen Sie vor:

  1. Laden Sie das Zertifikat von https://letsencrypt.org/certs/isrgrootx1.pem herunter und speichern Sie es auf Ihrem Server.
  2. Anschließend können Sie sich in PHP mit dem heruntergeladenen Zertifikat wie folgt verbinden:
$sslOptions = array(
  'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);

$connection = new AMQPSSLConnection(
  '<XXXXXX>.stackhero-network.com',
  <AMQP_PORT_TLS>,
  'admin',
  '<PASSWORD>',
  '/',
  $sslOptions
);

Wenn Sie Symfony verwenden, können Sie es so konfigurieren, dass RabbitMQ als Message Broker genutzt wird, indem Sie die Umgebungsvariable MESSENGER_TRANSPORT_DSN setzen. Aktualisieren Sie dazu einfach Ihre .env Datei:

MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt

Ersetzen Sie <USER>, <PASSWORD>, <HOST> und <PORT> durch Ihre eigenen RabbitMQ-Zugangsdaten.

Stellen Sie anschließend sicher, dass Ihre Datei config/packages/messenger.yaml die Variable MESSENGER_TRANSPORT_DSN verwendet. Sie sollte wie folgt aussehen:

framework:
    messenger:
        transports:
            async: '%env(MESSENGER_TRANSPORT_DSN)%'

Für Spring Boot-Anwendungen können Sie eine sichere Verbindung zu Ihrer Stackhero RabbitMQ-Instanz herstellen, indem Sie Ihre Application Properties wie folgt anpassen:

spring.rabbitmq.host=<XXXXXX>.stackhero-network.com
spring.rabbitmq.port=<AMQP_PORT_TLS>
spring.rabbitmq.username=admin
spring.rabbitmq.password=<PASSWORD>
spring.rabbitmq.ssl.enabled=true
spring.rabbitmq.ssl.algorithm=TLSv1.2

Wenn Sie mit .NET und MassTransit entwickeln, können Sie Ihr Projekt wie folgt konfigurieren, um eine sichere Verbindung zu Stackhero RabbitMQ mit TLS-Verschlüsselung herzustellen:

using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;

public class Program
{
  public static void Main(string[] args)
  {
    var host = Host.CreateDefaultBuilder(args)
      .ConfigureServices((context, services) =>
      {
        services.AddMassTransit(x =>
        {
          x.UsingRabbitMq((context, cfg) =>
          {
            cfg.Host(new Uri("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"), h =>
            {
              h.UseSsl(s =>
              {
                s.Protocol = System.Security.Authentication.SslProtocols.Tls12;
              });
            });
          });
        });

        services.AddMassTransitHostedService(true);
      })
      .Build();

    host.Run();
  }
}

Wenn Sie sich mit Elixir verbinden und folgende Fehlermeldung sehen:

CLIENT ALERT: Fatal - Handshake Failure

weist dies in der Regel auf einen Bug in der TLS 1.3-Unterstützung der AMQP-Bibliothek hin. Eine zuverlässige Lösung ist, explizit TLS 1.2 zu erzwingen, indem Sie beim Verbindungsaufbau folgende Option angeben:

AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])

Wenn Sie beim Einsatz von Node.js die Fehlermeldung Error: Socket closed abruptly during opening handshake erhalten, liegt dies meist daran, dass Sie eine Version der amqplib-Bibliothek älter als 0.10.7 mit RabbitMQ 4.1.0 oder neuer verwenden. Diese Änderung steht im Zusammenhang mit der Einstellung frame_max, die ab RabbitMQ 4.1.0 eingeführt wurde.

Um das Problem zu beheben, aktualisieren Sie Ihre amqplib-Bibliothek auf Version 0.10.7 oder neuer.