RabbitMQ: Aan de slag

Hoe Stackhero gebruiken voor RabbitMQ

Hier leggen we uit hoe u uw Python-applicatie kunt verbinden met RabbitMQ met behulp van de Aio Pika bibliotheek. In de meeste gevallen hoeft u alleen de AMQPS-URL op te geven voor een beveiligde verbinding:

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

Hieronder vindt u een volledig voorbeeld dat laat zien hoe u een beveiligde verbinding met RabbitMQ tot stand brengt, een channel aanmaakt en een eenvoudige queue declareert. Dit is een goede manier om uw setup te verifiëren:

import asyncio
import logging
import aio_pika

async def main() -> None:
    # Als u debuglogs wilt zien, kunt u de volgende regel deblokkeren
    # 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())

Als u bij het verbinden vanuit Python een foutmelding zoals deze krijgt:

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

betekent dit meestal dat het Let's Encrypt CA-certificaat op uw systeem ontbreekt. U kunt dit oplossen door het pakket met CA-certificaten voor uw besturingssysteem te installeren:

  1. Op Ubuntu/Debian voert u uit:

    sudo apt install ca-certificates
    
  2. Op Alpine Linux voert u uit:

    apk add ca-certificates
    

Als u deze commando's niet kunt gebruiken, kunt u het CA-certificaat ook handmatig installeren:

  1. Download het Let's Encrypt CA-certificaat van https://letsencrypt.org/certs/isrgrootx1.pem.

  2. Vervolgens kunt u in uw Python-code verbinding maken met RabbitMQ door het CA-certificaatbestand op te geven:

    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
    )
    

Hieronder vindt u een volledig voorbeeld waarbij het Let's Encrypt CA-certificaat wordt gebruikt voor een beveiligde verbinding:

import asyncio
import logging
import ssl
import aio_pika

async def main() -> None:
    # Om debuglogs te activeren, kunt u deze regel deblokkeren
    # logging.basicConfig(level=logging.DEBUG)

    ssl_context = ssl.create_default_context()
    # Laad het Let's Encrypt CA-certificaat dat u heeft gedownload
    # Bijvoorbeeld: 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())

Als u vanuit een Go-applicatie verbinding wilt maken met RabbitMQ, maakt de officiële Go RabbitMQ Client Library dit eenvoudig. Zo kunt u aan de slag:

  1. Maak een nieuwe directory aan en initialiseer uw Go-module:
go mod init rabbitmq-example
  1. Voeg vervolgens de RabbitMQ-bibliotheek toe aan uw project:
go get github.com/rabbitmq/amqp091-go
  1. Maak nu een bestand met de naam main.go en voeg deze code toe:

    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. U kunt uw code uitvoeren met:

go run main.go

Als de verbinding succesvol is, ziet u het bericht "Successfully connected to RabbitMQ instance". Dit betekent dat u veilig bent verbonden met authenticatie en TLS-encryptie.

Voor meer uitgebreide voorbeelden kunt u de Go-voorbeelden in de officiële RabbitMQ-repository bekijken: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.

Als u met PHP werkt, kunt u de php-amqplib bibliotheek gebruiken om verbinding te maken met uw RabbitMQ-instantie. Omdat Stackhero TLS-encryptie (SSL) gebruikt, is het aan te raden om AMQPSSLConnection te gebruiken:

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

Soms vereist uw TLS-verbinding een Certificate Authority (CA) certificaat. Veel systemen bevatten dit al, maar u kunt het indien nodig handmatig downloaden. Zo doet u dat:

  1. Download het certificaat van https://letsencrypt.org/certs/isrgrootx1.pem en sla het op uw server op.
  2. Vervolgens kunt u verbinding maken met PHP door het gedownloade certificaat als volgt te gebruiken:
$sslOptions = array(
  'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);

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

Als u Symfony gebruikt, kunt u deze configureren om RabbitMQ als message broker te gebruiken door de omgevingsvariabele MESSENGER_TRANSPORT_DSN in te stellen. U hoeft alleen uw .env-bestand aan te passen:

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

Vervang <USER>, <PASSWORD>, <HOST> en <PORT> door uw eigen RabbitMQ-gegevens.

Controleer vervolgens of uw config/packages/messenger.yaml-bestand de variabele MESSENGER_TRANSPORT_DSN gebruikt. Dit zou er ongeveer zo uit moeten zien:

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

Voor Spring Boot-applicaties kunt u een beveiligde verbinding met uw Stackhero RabbitMQ-instantie opzetten door uw application properties bij te werken:

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

Als u ontwikkelt met .NET en MassTransit, kunt u uw project als volgt configureren om veilig verbinding te maken met Stackhero RabbitMQ via TLS-encryptie:

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

Als u verbinding maakt vanuit Elixir en de volgende foutmelding ziet:

CLIENT ALERT: Fatal - Handshake Failure

wijst dit meestal op een bug in de AMQP-bibliotheek met betrekking tot ondersteuning voor TLS 1.3. Een betrouwbare workaround is om het gebruik van TLS 1.2 af te dwingen door deze optie toe te voegen bij het openen van de verbinding:

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

Als u de foutmelding Error: Socket closed abruptly during opening handshake ziet bij het gebruik van Node.js, komt dit waarschijnlijk doordat u een versie van de amqplib-bibliotheek gebruikt die ouder is dan 0.10.7 in combinatie met RabbitMQ 4.1.0 of nieuwer. Deze wijziging houdt verband met de frame_max instelling die is geïntroduceerd in RabbitMQ 4.1.0.

Om dit op te lossen, kunt u uw amqplib-bibliotheek bijwerken naar versie 0.10.7 of nieuwer.