RabbitMQ: 入門指南
如何使用 Stackhero for RabbitMQ
👋 歡迎來到 Stackhero 文件!
Stackhero 提供即用型的 RabbitMQ 雲端 解決方案,帶來多項好處,包括:
- 完整訪問 RabbitMQ 的 網頁介面,用於管理用戶、vhosts 和權限。
- 無限制的佇列,沒有保留時間限制。
- 支援 AMQP、MQTT、STOMP 和 WebSocket 協議。
- 包含多個插件,如
Delayed Message Exchange、Message Deduplication和Consistent-hash Exchange。- 只需點擊即可輕鬆進行 更新。
- 由 專用私有 VM 提供的最佳 效能 和強大 安全性。
節省時間並簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 RabbitMQ 雲端託管 解決方案!
使用 Python 連接到 RabbitMQ
此範例展示如何使用 Aio Pika 庫將 Python 連接到 RabbitMQ。在許多情況下,只需指定 AMQPS URL 即可:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
以下是一個完整的 Python 範例,建立與 RabbitMQ 的安全連接。您可以按照這些步驟驗證您的連接並設置基本隊列:
import asyncio
import logging
import aio_pika
async def main() -> None:
# 取消註解以下行以啟用調試日誌
# 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("連接成功!")
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())
處理錯誤 unable to get local issuer certificate
如果您看到錯誤
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
從 Python 連接到 RabbitMQ 時,通常表示您的系統缺少 Let's Encrypt 證書。要解決此問題,請安裝常見的 CA 證書:
-
在 Ubuntu/Debian 上,運行:
sudo apt install ca-certificates -
在 Alpine Linux 上,運行:
apk add ca-certificates
如果您無法使用這些命令,可以手動安裝 CA 證書:
-
從 https://letsencrypt.org/certs/isrgrootx1.pem 下載 Let's Encrypt CA 證書。
-
然後,在您的 Python 代碼中通過傳遞 CA 證書文件連接到 RabbitMQ:
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 )
以下是一個完整的 Python 範例,使用 Let's Encrypt CA 證書建立安全連接:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# 取消註解以下行以啟用調試日誌
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# 手動加載 Let's Encrypt CA 證書
# 使用: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("連接成功!")
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 連接到 RabbitMQ
以下是一個簡單的範例,展示如何使用官方 Go RabbitMQ Client Library 從 GoLang 應用程序連接到 RabbitMQ。按照這些步驟設置您的項目:
- 創建一個新目錄並初始化模組:
go mod init rabbitmq-example
- 添加 RabbitMQ 庫:
go get github.com/rabbitmq/amqp091-go
-
創建一個名為
main.go的新文件,並添加以下內容: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("成功連接到 RabbitMQ 實例") } -
運行您的代碼:
go run main.go
您應該看到 "成功連接到 RabbitMQ 實例",這表示您的代碼已使用身份驗證和 TLS 加密安全連接。
如需更多範例,您可以在官方 RabbitMQ 存儲庫中探索 Go 範例:https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go。
使用 PHP 連接到 RabbitMQ
以下是一個範例,展示如何使用 php-amqplib 庫從 PHP 連接到 RabbitMQ。由於 Stackhero 實例使用 TLS 加密 (SSL),因此必須使用 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);
手動下載 CA 證書
TLS 連接可能需要證書授權 (CA) 證書。雖然許多服務器已經安裝了此證書,但您可能需要手動下載。請按照以下步驟操作:
- 從 https://letsencrypt.org/certs/isrgrootx1.pem 下載證書並將其保存到您的服務器上。
- 使用以下 PHP 代碼通過下載的證書進行連接:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
使用 PHP/Symfony 連接到 RabbitMQ
Symfony 可以通過設置 MESSENGER_TRANSPORT_DSN 環境變量來使用 RabbitMQ 作為消息代理。要配置此項,請編輯 .env 文件並設置變量如下:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
替換
<USER>、<PASSWORD>、<HOST>和<PORT>為您的 RabbitMQ 詳細信息。
還要確保文件 config/packages/messenger.yaml 使用 MESSENGER_TRANSPORT_DSN 變量。配置應如下所示:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
使用 Spring Boot 連接到 RabbitMQ
以下是一個配置 Spring Boot 以安全連接到 Stackhero RabbitMQ 實例的範例。使用以下設置更新您的應用程序屬性:
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 和 MassTransit 連接到 RabbitMQ
這是一個範例,展示如何使用 .NET 和 MassTransit 連接到 Stackhero RabbitMQ。此範例配置主機以進行 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();
}
}
延遲消息
使用 "延遲消息" 插件,您可以通過設置毫秒延遲來延遲或安排消息。可以直接從 Stackhero 儀表板激活該插件。激活插件後,可以通過 RabbitMQ 管理面板或直接在代碼中創建延遲交換。
如需更多詳細信息,請參閱官方存儲庫:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange。
如果您禁用插件,任何尚未交付的延遲消息將會丟失。
通過 RabbitMQ 管理面板創建延遲交換
在 Stackhero 儀表板上激活插件後,導航到您的 RabbitMQ 管理面板並創建一個類型為 "x-delayed-message" 的交換。然後添加一個鍵為 x-delayed-type,值為 "direct" 的參數。此設置在下面的截圖中顯示。
Exchange creation
如果您遇到錯誤 "Invalid argument, 'x-delayed-type' must be an existing exchange type",請確保您已正確設置 x-delayed-type 參數。
使用 Elixir 處理錯誤 CLIENT ALERT: Fatal - Handshake Failure
使用 Elixir 連接到 RabbitMQ 時,您可能會遇到錯誤
CLIENT ALERT: Fatal - Handshake Failure
此問題與 Elixir 的 AMQP 庫中對 TLS 1.3 支持的錯誤有關。一個實用的解決方案是強制使用 TLS 1.2。您可以通過在打開連接時包含以下選項來實現:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
使用 Node.js 處理錯誤 Error: Socket closed abruptly during opening handshake
當使用版本低於 0.10.7 的 Node.js amqplib 庫連接到 RabbitMQ 4.1.0 或更高版本時,可能會出現錯誤 Error: Socket closed abruptly during opening handshake。此問題與 RabbitMQ 4.1.0 中引入的 frame_max 設置更改有關。
要解決此錯誤,請將您的 amqplib 庫更新到 0.10.7 或更高版本。