RabbitMQ - 生产者发布确认模式
在消息队列系统中,生产者负责发送消息到消息队列中,而消费者负责从消息队列中接收并处理消息。在生产者发布消息时,为了确保消息被成功发送到消息队列,可以使用生产者发布确认模式。该模式允许生产者在消息被确认(即成功接收)或者未确认(发送失败)时得到通知,从而确保消息的可靠性。
主要步骤如下:
- 连接到RabbitMQ服务器:通过使用
amqp.Dial
函数建立与RabbitMQ服务器的连接。
- 创建通道:使用连接创建一个RabbitMQ通道,所有的RabbitMQ操作都是通过通道进行的。
- 启用确认模式:通过
ch.Confirm(false)
启用发布确认模式。
- 创建用于接收确认信息的通道:使用
ch.NotifyPublish
创建一个通道(Channel),用于接收确认信号。
- 发送消息:通过
ch.Publish
函数向指定的交换机发送消息。 - 等待确认信息:通过读取
confirms
通道来等待确认信号,如果消息成功发送到RabbitMQ,则确认信号的confirmed.Ack
为true,否则为false。
package main
import (
"fmt"
"log"
"github.com/streadway/amqp"
)
func main() {
// 连接到RabbitMQ服务器
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatal("无法连接到RabbitMQ服务器:", err)
}
defer conn.Close()
// 创建通道
ch, err := conn.Channel()
if err != nil {
log.Fatal("无法打开RabbitMQ通道:", err)
}
defer ch.Close()
// 启用确认模式
if err := ch.Confirm(false); err != nil {
log.Fatal("无法启用确认模式:", err)
}
// 创建一个用于接收确认信息的通道
confirms := ch.NotifyPublish(make(chan amqp.Confirmation, 1))
// 发送消息到一个已存在的交换机
err = ch.Publish(
"existing_exchange", // 已存在的交换机名称
"routing_key", // 路由键
false, // 强制性标志
false, // 立即标志
amqp.Publishing{
ContentType: "text/plain",
Body: []byte("Hello, RabbitMQ!"),
},
)
if err != nil {
log.Fatal("无法发送消息到RabbitMQ:", err)
}
// 等待确认信息
confirmed := <-confirms
if confirmed.Ack {
fmt.Println("消息已成功发送到RabbitMQ")
} else {
fmt.Println("消息发送失败到RabbitMQ")
}
}
在实际生产环境中,可以根据业务需求进行更复杂的处理,比如处理多个消息,实现消息重试机制等。同时,建议将错误处理、日志记录、补发数据等功能加入到代码中,以确保更好的可靠性和可维护性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」