RabbitMQ: Erste Schritte
Wie Sie Stackhero für RabbitMQ nutzen
Mit Python eine Verbindung zu RabbitMQ herstellen
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())
Fehler unable to get local issuer certificate beheben
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:
-
Unter Ubuntu/Debian können Sie folgenden Befehl ausführen:
sudo apt install ca-certificates -
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:
-
Laden Sie das Let's Encrypt CA-Zertifikat von https://letsencrypt.org/certs/isrgrootx1.pem herunter.
-
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())
Mit GoLang eine Verbindung zu RabbitMQ herstellen
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:
- Erstellen Sie ein neues Verzeichnis und initialisieren Sie Ihr Go-Modul:
go mod init rabbitmq-example
- Fügen Sie anschließend die RabbitMQ-Bibliothek zu Ihrem Projekt hinzu:
go get github.com/rabbitmq/amqp091-go
-
Erstellen Sie nun eine Datei mit dem Namen
main.gound 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") } -
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.
Mit PHP eine Verbindung zu RabbitMQ herstellen
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);
CA-Zertifikat manuell herunterladen
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:
- Laden Sie das Zertifikat von https://letsencrypt.org/certs/isrgrootx1.pem herunter und speichern Sie es auf Ihrem Server.
- 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
);
Mit PHP/Symfony eine Verbindung zu RabbitMQ herstellen
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)%'
Mit Spring Boot eine Verbindung zu RabbitMQ herstellen
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
Mit .NET und MassTransit eine Verbindung zu RabbitMQ herstellen
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();
}
}
Fehler CLIENT ALERT: Fatal - Handshake Failure mit Elixir beheben
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" ] ])
Fehler Error: Socket closed abruptly during opening handshake mit Node.js beheben
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.