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 Deduplication et Consistent-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 !

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())

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 :

  1. Sur Ubuntu/Debian, exécutez :

    sudo apt install ca-certificates
    
  2. Sur Alpine Linux, exécutez :

    apk add ca-certificates
    

Si vous ne pouvez pas utiliser ces commandes, vous pouvez installer le certificat CA manuellement :

  1. Téléchargez le certificat CA Let's Encrypt depuis https://letsencrypt.org/certs/isrgrootx1.pem.

  2. 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())

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 :

  1. Créez un nouveau dossier et initialisez le module :
go mod init rabbitmq-example
  1. Ajoutez la bibliothèque RabbitMQ :
go get github.com/rabbitmq/amqp091-go
  1. Créez un nouveau fichier nommé main.go et 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")
    }
    
  2. 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.

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);

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 :

  1. Téléchargez le certificat depuis https://letsencrypt.org/certs/isrgrootx1.pem et enregistrez-le sur votre serveur.
  2. 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
);

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)%'

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

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();
  }
}

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.

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

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" ] ])

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.