RabbitMQ: Premiers pas

Comment utiliser Stackhero pour RabbitMQ

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution RabbitMQ cloud prête à l'emploi offrant de nombreux avantages, notamment :

  • Accès complet à l'interface web de RabbitMQ pour gérer les utilisateurs, vhosts et permissions.
  • Files d'attente illimitées sans limitation de temps de rétention.
  • Prise en charge des protocoles AMQP, MQTT, STOMP et WebSocket.
  • Nombreux plugins inclus, tels que Delayed Message Exchange, Message Deduplication et Consistent-hash Exchange.
  • Mises à jour simplifiées en un clic.
  • Performance optimale et sécurité robuste 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 cloud RabbitMQ de Stackhero !

Cet exemple montre comment utiliser la bibliothèque Aio Pika pour connecter Python à RabbitMQ. Dans de nombreux cas, spécifier l'URL AMQPS est suffisant :

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

Ci-dessous un exemple complet en Python qui établit une connexion sécurisée à RabbitMQ. Vous pouvez suivre ces étapes pour vérifier votre connexion et configurer 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 débogage
    # 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 manque du certificat Let's Encrypt. Pour résoudre ce problème, installez les certificats CA communs :

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

Ci-dessous un exemple complet en Python 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 débogage
    # logging.basicConfig(level=logging.DEBUG)

    ssl_context = ssl.create_default_context()
    # Chargez manuellement le certificat CA Let's Encrypt
    # Téléchargez-le en utilisant : 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())

Ci-dessous un exemple simple qui montre comment se connecter à RabbitMQ depuis une application GoLang en utilisant la bibliothèque officielle Go RabbitMQ Client Library. Suivez ces étapes pour configurer votre projet :

  1. Créez un nouveau répertoire 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("Connecté avec succès à l'instance RabbitMQ")
    }
    
  2. Exécutez votre code :

go run main.go

Vous devriez voir "Connecté avec succès à l'instance RabbitMQ", ce qui indique que votre code s'est connecté en toute sécurité en utilisant l'authentification et le chiffrement TLS.

Pour plus d'exemples, vous pouvez explorer les exemples Go sur le dépôt officiel RabbitMQ : https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.

Ci-dessous un exemple qui démontre comment se connecter à RabbitMQ depuis PHP en utilisant la bibliothèque php-amqplib. Étant donné que 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). Bien que de nombreux serveurs l'aient déjà installé, vous pourriez avoir besoin de le télécharger manuellement. Suivez ces étapes :

  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 courtier de messages en définissant la variable d'environnement MESSENGER_TRANSPORT_DSN. Pour configurer cela, éditez 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 détails RabbitMQ.

Assurez-vous également que le fichier config/packages/messenger.yaml utilise la variable MESSENGER_TRANSPORT_DSN. La configuration devrait ressembler à ceci :

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

Ci-dessous un exemple de configuration de Spring Boot pour se connecter en toute sécurité à 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 à Stackhero RabbitMQ en utilisant .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 "Messages différés", vous pouvez retarder ou planifier des messages en définissant un délai en millisecondes. Le plugin peut être activé directement depuis le tableau de bord Stackhero. Après avoir activé le plugin, créez un échange différé soit via le panneau d'administration RabbitMQ, soit directement dans votre code.

Pour plus de détails, 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 qui n'ont pas encore été livrés seront perdus.

Après avoir activé le plugin sur le tableau de bord Stackhero, accédez à votre panneau d'administration RabbitMQ et créez un échange 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.

Création d'échangeCréation d'échange

Si vous rencontrez l'erreur "Invalid argument, 'x-delayed-type' must be an existing exchange type", assurez-vous d'avoir correctement défini l'argument x-delayed-type.

Lorsque vous utilisez Elixir pour vous connecter à RabbitMQ, vous pourriez rencontrer l'erreur

CLIENT ALERT: Fatal - Handshake Failure

Ce problème est lié à un bug avec la prise en charge de TLS 1.3 dans la bibliothèque AMQP pour Elixir. Une solution pratique est de forcer l'utilisation de TLS 1.2. Vous pouvez y parvenir en incluant 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 lors de l'utilisation d'une version de la bibliothèque amqplib de Node.js antérieure à 0.10.7 lors de la connexion à RabbitMQ 4.1.0 ou ultérieur. Ce problème est lié à un changement dans le paramètre frame_max introduit dans RabbitMQ 4.1.0.

Pour résoudre l'erreur, mettez à jour votre bibliothèque amqplib à la version 0.10.7 ou ultérieure.