RabbitMQ: Premiers pas
Comment utiliser Stackhero pour RabbitMQ
👋 Bienvenue sur la documentation de Stackhero !
Stackhero propose une solution RabbitMQ cloud prête à l'emploi qui offre de nombreux avantages, notamment :
- Accès complet à l'interface web de RabbitMQ pour gérer les utilisateurs, les vhosts et les permissions.
- Files d'attente illimitées sans aucune limite de durée de rétention.
- Prise en charge des protocoles AMQP, MQTT, STOMP et WebSocket.
- De nombreux plugins inclus, comme
Delayed Message Exchange,Message DeduplicationetConsistent-hash Exchange.- Mises à jour simplifiées en un clic.
- Performance optimale et sécurité renforcée grâce à une VM privée et dédiée.
Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution d'hébergement RabbitMQ cloud de Stackhero !
Utiliser Python pour se connecter à RabbitMQ
Cet exemple montre comment utiliser la bibliothèque Aio Pika pour connecter Python à RabbitMQ. Dans la plupart des cas, il suffit d'indiquer l'URL AMQPS :
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
Vous trouverez ci-dessous un exemple Python complet qui établit une connexion sécurisée à RabbitMQ. Suivez ces étapes pour vérifier votre connexion et créer une file d'attente basique :
import asyncio
import logging
import aio_pika
async def main() -> None:
# Décommentez la ligne suivante pour activer les logs de debug
# 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("La connexion a fonctionné !")
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())
Gérer l'erreur unable to get local issuer certificate
Si vous voyez l'erreur
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
lors de la connexion à RabbitMQ depuis Python, cela indique généralement que votre système ne dispose pas du certificat Let's Encrypt. Pour corriger cela, installez les certificats CA courants :
-
Sur Ubuntu/Debian, exécutez :
sudo apt install ca-certificates -
Sur Alpine Linux, exécutez :
apk add ca-certificates
Si vous ne pouvez pas utiliser ces commandes, vous pouvez installer le certificat CA manuellement :
-
Téléchargez le certificat CA Let's Encrypt depuis https://letsencrypt.org/certs/isrgrootx1.pem.
-
Ensuite, connectez-vous à RabbitMQ dans votre code Python en passant le fichier du certificat CA :
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 )
Voici un exemple Python complet qui utilise le certificat CA Let's Encrypt pour établir une connexion sécurisée :
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# Décommentez la ligne suivante pour activer les logs de debug
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# Chargez manuellement le certificat CA Let's Encrypt
# Téléchargez-le avec : 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("La connexion a fonctionné !")
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())
Utiliser GoLang pour se connecter à RabbitMQ
Voici un exemple simple qui montre comment se connecter à RabbitMQ depuis une application GoLang en utilisant la Go RabbitMQ Client Library officielle. Suivez ces étapes pour configurer votre projet :
- Créez un nouveau dossier et initialisez le module :
go mod init rabbitmq-example
- Ajoutez la bibliothèque RabbitMQ :
go get github.com/rabbitmq/amqp091-go
-
Créez un nouveau fichier nommé
main.goet ajoutez le contenu suivant :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("Connexion réussie à l'instance RabbitMQ") } -
Exécutez votre code :
go run main.go
Vous devriez voir "Connexion réussie à l'instance RabbitMQ", ce qui indique que votre code s'est connecté de façon sécurisée avec authentification et chiffrement TLS.
Pour plus d'exemples, vous pouvez consulter les exemples Go sur le dépôt officiel RabbitMQ : https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.
Utiliser PHP pour se connecter à RabbitMQ
Voici un exemple qui montre comment se connecter à RabbitMQ depuis PHP en utilisant la bibliothèque php-amqplib. Comme les instances Stackhero utilisent le chiffrement TLS (SSL), la connexion doit être établie avec AMQPSSLConnection :
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);
Télécharger manuellement le certificat CA
La connexion TLS peut nécessiter un certificat d'Autorité de Certification (CA). Même si de nombreux serveurs disposent déjà de ce certificat, il peut être nécessaire de le télécharger manuellement. Procédez ainsi :
- Téléchargez le certificat depuis https://letsencrypt.org/certs/isrgrootx1.pem et enregistrez-le sur votre serveur.
- Utilisez le code PHP suivant pour vous connecter en utilisant le certificat téléchargé :
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
Utiliser PHP/Symfony pour se connecter à RabbitMQ
Symfony peut utiliser RabbitMQ comme message broker en configurant la variable d'environnement MESSENGER_TRANSPORT_DSN. Pour cela, modifiez le fichier .env et définissez la variable comme suit :
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
Remplacez
<USER>,<PASSWORD>,<HOST>et<PORT>par vos informations RabbitMQ.
Vérifiez également que le fichier config/packages/messenger.yaml utilise bien la variable MESSENGER_TRANSPORT_DSN. La configuration doit ressembler à ceci :
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Utiliser Spring Boot pour se connecter à RabbitMQ
Voici comment configurer Spring Boot pour se connecter de façon sécurisée à une instance RabbitMQ Stackhero. Mettez à jour les propriétés de votre application avec ces paramètres :
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
Utiliser .NET et MassTransit pour se connecter à RabbitMQ
Voici un exemple montrant comment se connecter à RabbitMQ Stackhero avec .NET et MassTransit. Cet exemple configure l'hôte avec les paramètres nécessaires pour le chiffrement TLS :
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();
}
}
Messages différés
Avec le plugin "Delayed messages", vous pouvez différer ou planifier l'envoi de messages en définissant un délai en millisecondes. Ce plugin peut être activé directement depuis le tableau de bord Stackhero. Après activation, créez un exchange différé soit via le panneau d'administration RabbitMQ, soit directement dans votre code.
Pour plus d'informations, consultez le dépôt officiel : https://github.com/rabbitmq/rabbitmq-delayed-message-exchange.
Si vous désactivez le plugin, tous les messages différés non encore délivrés seront perdus.
Créer un exchange différé via le panneau d'administration RabbitMQ
Après avoir activé le plugin sur le tableau de bord Stackhero, rendez-vous sur le panneau d'administration RabbitMQ et créez un exchange de type "x-delayed-message". Ajoutez ensuite un argument avec la clé x-delayed-type et la valeur "direct". Cette configuration est illustrée dans la capture d'écran ci-dessous.
Exchange creation
Si vous rencontrez l'erreur "Invalid argument, 'x-delayed-type' must be an existing exchange type", vérifiez que vous avez bien renseigné l'argument x-delayed-type.
Gérer l'erreur CLIENT ALERT: Fatal - Handshake Failure avec Elixir
Lorsque vous utilisez Elixir pour vous connecter à RabbitMQ, il se peut que vous rencontriez l'erreur
CLIENT ALERT: Fatal - Handshake Failure
Ce problème est lié à un bug de la prise en charge de TLS 1.3 dans la bibliothèque AMQP pour Elixir. Une solution consiste à forcer l'utilisation de TLS 1.2. Pour cela, ajoutez l'option suivante lors de l'ouverture de la connexion :
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
Gérer l'erreur Error: Socket closed abruptly during opening handshake avec Node.js
L'erreur Error: Socket closed abruptly during opening handshake peut survenir si vous utilisez une version de la bibliothèque Node.js amqplib antérieure à 0.10.7 lors de la connexion à RabbitMQ 4.1.0 ou supérieur. Ce problème est lié à une modification du paramètre frame_max introduite dans RabbitMQ 4.1.0.
Pour corriger cette erreur, mettez à jour votre bibliothèque amqplib vers la version 0.10.7 ou supérieure.