概述与客户端对比
rabbitmq-amqp-go-client 是 RabbitMQ 官方的 AMQP 1.0 协议 Go 客户端。本章介绍它的定位、前置条件,以及与传统 AMQP 0.9.1 客户端(amqp091-go)的核心差异和迁移要点。
官方仓库: rabbitmq/rabbitmq-amqp-go-client Go 包路径:
github.com/rabbitmq/rabbitmq-amqp-go-client/pkg/rabbitmqamqp协议: AMQP 1.0(OASIS 标准) RabbitMQ 最低版本: 4.0+ 底层依赖: 基于 Azure AMQP 客户端 (github.com/Azure/go-amqp) 封装
什么是 AMQP 1.0 Go 客户端?
rabbitmq-amqp-go-client 是 RabbitMQ 官方提供的 AMQP 1.0 协议 Go 语言客户端。与传统的 AMQP 0.9.1 客户端(amqp091-go)不同,它:
- 基于 OASIS 标准的 AMQP 1.0 协议(而非 RabbitMQ 私有的 AMQP 0.9.1)
- 不再使用 Channel 概念,Publisher/Consumer 直接从 Connection 创建
- 使用 Settlement(结算) 机制替代传统的 Ack/Nack
- 使用 Credits(信用额度) 进行流量控制,替代 Prefetch/QoS
- 需要 RabbitMQ 4.0 或更高版本
前置条件
# 安装依赖
go get github.com/rabbitmq/rabbitmq-amqp-go-client
# RabbitMQ 4.0+ 必须已安装并运行
# 默认连接端口: 5672
# AMQP 1.0 插件默认在 RabbitMQ 4.0+ 中已启用导入包
import (
rmq "github.com/rabbitmq/rabbitmq-amqp-go-client/pkg/rabbitmqamqp"
)与 AMQP 0.9.1 客户端的对比
核心差异一览
| 特性 | AMQP 1.0 (rabbitmq-amqp-go-client) | AMQP 0.9.1 (amqp091-go) |
|---|---|---|
| 协议 | AMQP 1.0(OASIS 标准) | AMQP 0.9.1(RabbitMQ 扩展) |
| RabbitMQ 版本 | 4.0+ | 3.x / 4.x |
| 入口点 | Environment → Connection |
Connection → Channel |
| Channel | ❌ 无 Channel 概念 | ✅ 必须创建 Channel |
| 发布 | conn.NewPublisher() |
ch.Publish() |
| 消费 | conn.NewConsumer() |
ch.Consume() |
| 流量控制 | InitialCredits(信用额度) |
Qos(prefetchCount) |
| 确认 | delivery.Accept() |
d.Ack() |
| 拒绝 | delivery.Discard() / delivery.Requeue() |
d.Nack() / d.Reject() |
| 包路径 | rabbitmq/rabbitmq-amqp-go-client |
rabbitmq/amqp091-go |
| 依赖 | Azure AMQP 客户端 | 纯 Go 实现 |
代码对比
声明队列并发布:
// ─── AMQP 1.0 (新版) ───
env := rmq.NewEnvironment("amqp://guest:guest@localhost:5672/", nil)
conn, _ := env.NewConnection(ctx)
conn.Management().DeclareQueue(ctx, &rmq.QuorumQueueSpecification{Name: "hello"})
publisher, _ := conn.NewPublisher(ctx, &rmq.QueueAddress{Queue: "hello"}, nil)
result, _ := publisher.Publish(ctx, rmq.NewMessage([]byte("Hello!")))
// 检查 result.Outcome
// ─── AMQP 0.9.1 (旧版) ───
conn, _ := amqp.Dial("amqp://guest:guest@localhost:5672/")
ch, _ := conn.Channel()
ch.QueueDeclare("hello", true, false, false, false, nil)
ch.Publish("", "hello", false, false, amqp.Publishing{Body: []byte("Hello!")})消费消息:
// ─── AMQP 1.0 (新版) ───
consumer, _ := conn.NewConsumer(ctx, "hello", &rmq.ConsumerOptions{InitialCredits: 1})
for {
delivery, _ := consumer.Receive(ctx)
body := delivery.Message().Data()[0]
delivery.Accept(ctx)
}
// ─── AMQP 0.9.1 (旧版) ───
ch.Qos(1, 0, false)
msgs, _ := ch.Consume("hello", "", false, false, false, false, nil)
for d := range msgs {
body := d.Body
d.Ack(false)
}Migration 迁移要点
从 amqp091-go 迁移到 rabbitmq-amqp-go-client 时需要注意:
- 不再有 Channel:Publisher 和 Consumer 直接从 Connection 创建
- Credit 替代 Prefetch:
InitialCredits控制未确认消息数 - Accept 替代 Ack:必须显式调用
delivery.Accept(ctx) - Quorum Queue 推荐:
QuorumQueueSpecification作为默认队列类型 - Settlement 是必须的:每条收到的消息都必须结算,否则断开后重新入队