Skip to content
概述与客户端对比

概述与客户端对比

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
入口点 EnvironmentConnection ConnectionChannel
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 时需要注意:

  1. 不再有 Channel:Publisher 和 Consumer 直接从 Connection 创建
  2. Credit 替代 PrefetchInitialCredits 控制未确认消息数
  3. Accept 替代 Ack:必须显式调用 delivery.Accept(ctx)
  4. Quorum Queue 推荐QuorumQueueSpecification 作为默认队列类型
  5. Settlement 是必须的:每条收到的消息都必须结算,否则断开后重新入队

参考资源

资源 地址
官方仓库 https://github.com/rabbitmq/rabbitmq-amqp-go-client
示例代码目录 https://github.com/rabbitmq/rabbitmq-amqp-go-client/tree/main/docs/examples
Go 包文档 https://pkg.go.dev/github.com/rabbitmq/rabbitmq-amqp-go-client
AMQP 1.0 入门教程 https://www.rabbitmq.com/tutorials/tutorial-one-go-amqp10
工作队列教程 https://www.rabbitmq.com/tutorials/tutorial-two-go-amqp10
发布/订阅教程 https://www.rabbitmq.com/tutorials/tutorial-three-go-amqp10
路由教程 https://www.rabbitmq.com/tutorials/tutorial-four-go-amqp10
主题教程 https://www.rabbitmq.com/tutorials/tutorial-five-go-amqp10
AMQP 1.0 规范 http://docs.oasis-open.org/amqp/core/v1.0/amqp-core-complete-v1.0.pdf