RabbitMQ: Aan de slag
Hoe Stackhero voor RabbitMQ te gebruiken
👋 Welkom bij de Stackhero-documentatie!
Stackhero biedt een gebruiksklare RabbitMQ cloud oplossing die tal van voordelen biedt, waaronder:
- Volledige toegang tot de RabbitMQ webinterface voor het beheren van gebruikers, vhosts en permissies.
- Onbeperkte wachtrijen zonder beperkingen op retentietijd.
- Ondersteunt de protocollen AMQP, MQTT, STOMP en WebSocket.
- Veel plugins inbegrepen, zoals
Delayed Message Exchange,Message DeduplicationenConsistent-hash Exchange.- Moeiteloze updates met slechts één klik.
- Optimale prestaties en robuuste beveiliging aangedreven door een privé en toegewijde VM.
Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de RabbitMQ cloud hosting oplossing van Stackhero te proberen!
Python gebruiken om verbinding te maken met RabbitMQ
Dit voorbeeld laat zien hoe u de Aio Pika bibliotheek kunt gebruiken om Python te verbinden met RabbitMQ. In veel gevallen is het specificeren van de AMQPS URL voldoende:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
Hieronder staat een compleet Python-voorbeeld dat een beveiligde verbinding met RabbitMQ tot stand brengt. U kunt deze stappen volgen om uw verbinding te verifiëren en een basiswachtrij op te zetten:
import asyncio
import logging
import aio_pika
async def main() -> None:
# Haal de volgende regel uit commentaar om debuglogs in te schakelen
# 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("De verbinding werkte!")
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())
Fout unable to get local issuer certificate afhandelen
Als u de fout ziet
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
bij het verbinden met RabbitMQ vanuit Python, geeft dit meestal aan dat uw systeem het Let's Encrypt-certificaat mist. Om dit op te lossen, installeert u de algemene CA-certificaten:
-
Op Ubuntu/Debian, voer uit:
sudo apt install ca-certificates -
Op Alpine Linux, voer uit:
apk add ca-certificates
Als u deze opdrachten niet kunt gebruiken, kunt u het CA-certificaat handmatig installeren:
-
Download het Let's Encrypt CA-certificaat van https://letsencrypt.org/certs/isrgrootx1.pem.
-
Verbind vervolgens met RabbitMQ in uw Python-code door het CA-certificaatbestand door 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 staat een compleet Python-voorbeeld dat het Let's Encrypt CA-certificaat gebruikt om een beveiligde verbinding tot stand te brengen:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# Haal de volgende regel uit commentaar om debuglogs in te schakelen
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# Laad handmatig het Let's Encrypt CA-certificaat
# Download het met: 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("De verbinding werkte!")
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())
GoLang gebruiken om verbinding te maken met RabbitMQ
Hieronder staat een eenvoudig voorbeeld dat laat zien hoe u verbinding kunt maken met RabbitMQ vanuit een GoLang-applicatie met behulp van de officiële Go RabbitMQ Client Library. Volg deze stappen om uw project op te zetten:
- Maak een nieuwe map en initialiseer de module:
go mod init rabbitmq-example
- Voeg de RabbitMQ-bibliotheek toe:
go get github.com/rabbitmq/amqp091-go
-
Maak een nieuw bestand genaamd
main.goen voeg de volgende inhoud 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("Succesvol verbonden met RabbitMQ-instantie") } -
Voer uw code uit:
go run main.go
U zou "Succesvol verbonden met RabbitMQ-instantie" moeten zien, wat aangeeft dat uw code veilig is verbonden met behulp van authenticatie en TLS-versleuteling.
Voor meer voorbeelden kunt u Go-voorbeelden verkennen in de officiële RabbitMQ-repository: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.
PHP gebruiken om verbinding te maken met RabbitMQ
Hieronder staat een voorbeeld dat laat zien hoe u verbinding kunt maken met RabbitMQ vanuit PHP met behulp van de php-amqplib bibliotheek. Aangezien Stackhero-instanties TLS-versleuteling (SSL) gebruiken, moet de verbinding worden gemaakt met 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);
Het CA-certificaat handmatig downloaden
De TLS-verbinding kan een Certificate Authority (CA) certificaat vereisen. Hoewel veel servers dit al hebben geïnstalleerd, moet u het mogelijk handmatig downloaden. Volg deze stappen:
- Download het certificaat van https://letsencrypt.org/certs/isrgrootx1.pem en sla het op op uw server.
- Gebruik de volgende PHP-code om verbinding te maken met het gedownloade certificaat:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
PHP/Symfony gebruiken om verbinding te maken met RabbitMQ
Symfony kan RabbitMQ gebruiken als een message broker door de MESSENGER_TRANSPORT_DSN omgevingsvariabele in te stellen. Om dit te configureren, bewerkt u het .env bestand en stelt u de variabele als volgt in:
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 RabbitMQ-gegevens.
Zorg er ook voor dat het bestand config/packages/messenger.yaml de variabele MESSENGER_TRANSPORT_DSN gebruikt. De configuratie zou er als volgt uit moeten zien:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Spring Boot gebruiken om verbinding te maken met RabbitMQ
Hieronder staat een voorbeeld van hoe u Spring Boot kunt configureren om veilig verbinding te maken met een Stackhero RabbitMQ-instantie. Werk uw applicatie-eigenschappen bij met deze instellingen:
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
.NET en MassTransit gebruiken om verbinding te maken met RabbitMQ
Hier is een voorbeeld dat laat zien hoe u verbinding kunt maken met Stackhero RabbitMQ met behulp van .NET en MassTransit. Dit voorbeeld configureert de host met de nodige instellingen voor TLS-versleuteling:
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();
}
}
Vertraagde berichten
Met de "Vertraagde berichten" plugin kunt u berichten vertragen of plannen door een vertraging in milliseconden in te stellen. De plugin kan direct vanuit het Stackhero-dashboard worden geactiveerd. Na het activeren van de plugin, maakt u een vertraagde exchange aan via het RabbitMQ-beheerpaneel of direct in uw code.
Voor meer details, raadpleeg de officiële repository: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange.
Als u de plugin uitschakelt, gaan alle vertraagde berichten die nog niet zijn afgeleverd verloren.
Een vertraagde exchange maken via het RabbitMQ-beheerpaneel
Na het activeren van de plugin op het Stackhero-dashboard, navigeert u naar uw RabbitMQ-beheerpaneel en maakt u een exchange aan met het type "x-delayed-message". Voeg vervolgens een argument toe met de sleutel x-delayed-type en de waarde "direct". Deze configuratie wordt geïllustreerd in de onderstaande screenshot.
Exchange aanmaken
Als u de fout "Invalid argument, 'x-delayed-type' must be an existing exchange type" tegenkomt, zorg er dan voor dat u het x-delayed-type argument correct hebt ingesteld.
Fout CLIENT ALERT: Fatal - Handshake Failure afhandelen met Elixir
Wanneer u Elixir gebruikt om verbinding te maken met RabbitMQ, kunt u de fout tegenkomen
CLIENT ALERT: Fatal - Handshake Failure
Dit probleem is gerelateerd aan een bug met TLS 1.3-ondersteuning in de AMQP-bibliotheek voor Elixir. Een praktische oplossing is om het gebruik van TLS 1.2 te forceren. U kunt dit bereiken door de volgende optie op te nemen 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" ] ])
Fout Error: Socket closed abruptly during opening handshake afhandelen met Node.js
De fout Error: Socket closed abruptly during opening handshake kan optreden bij het gebruik van een versie van de Node.js amqplib bibliotheek ouder dan 0.10.7 bij het verbinden met RabbitMQ 4.1.0 of later. Dit probleem is gerelateerd aan een wijziging in de frame_max instelling geïntroduceerd in RabbitMQ 4.1.0.
Om de fout op te lossen, werkt u uw amqplib bibliotheek bij naar versie 0.10.7 of later.