在 RabbitMQ 中,durability
参数不仅可以应用于队列,也可以应用于交换机(Exchange)。durability
参数决定了 交换机(Exchange) 在 RabbitMQ 服务器重启后是否仍然存在。
durability
在 Exchange 上的作用
-
持久交换机(Durable Exchange):
- 当
durability
参数设置为true
时,交换机会被标记为持久化。 - 效果:RabbitMQ 服务器重启后,交换机会继续存在,不需要重新声明。
- 当
-
非持久交换机(Non-durable Exchange):
- 当
durability
参数设置为false
时,交换机是非持久化的。 - 效果:RabbitMQ 服务器重启后,非持久的交换机会被删除,所有绑定到该交换机的队列和路由关系也会消失。
- 当
持久交换机和消息持久化的关系
- 交换机的持久化 只决定了交换机本身是否会在 RabbitMQ 重启后保留。
- 消息持久化 则是另一回事,消息的持久化是通过设置
deliveryMode
来实现的。即便交换机是持久化的,消息也需要显式设置为持久化,才能在 RabbitMQ 重启后继续保留。
Go 语言中设置 Exchange 的 durability
在 Go 语言中,使用 amqp
包创建交换机时,可以通过 ExchangeDeclare
函数的 durable
参数来指定交换机的持久性。以下是一个示例:
Go
err := ch.ExchangeDeclare(
"my_durable_exchange", // 交换机名称
"direct", // 交换机类型
true, // durable: 设置为 true 表示交换机持久化
false, // auto-deleted: 设置为 false 表示不会自动删除
false, // internal: 设置为 false 表示外部可以使用
false, // noWait: 设置为 false 表示等待服务器确认
nil, // 额外参数
)
if err != nil {
log.Fatalf("Failed to declare an exchange: %s", err)
}
参数解释
durable: true
:表示该交换机是持久化的,即在 RabbitMQ 重启后仍然存在。auto-deleted
:如果设置为true
,表示当没有队列绑定到交换机时,交换机会自动删除。如果设置为false
,交换机不会自动删除。
持久交换机 vs. 非持久交换机
属性 | 持久交换机(Durable Exchange) | 非持久交换机(Non-durable Exchange) |
---|---|---|
交换机是否保留 | 是,RabbitMQ 重启后交换机仍然存在 | 否,RabbitMQ 重启后交换机会被删除 |
适用场景 | 需要交换机长时间存在的场景 | 临时交换机或不需要长时间存在的交换机 |
示例:持久交换机 + 持久消息
在 RabbitMQ 中,想要保证消息系统的可靠性,需要同时设置 交换机持久化 和 消息持久化。以下是一个完整的 Go 代码示例,展示如何创建持久化的交换机并发布持久化消息:
Go
package main
import (
"log"
"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
// 连接到 RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@110.40.140.47:5672/my_vhost")
failOnError(err, "Failed to connect to RabbitMQ")
defer conn.Close()
// 创建一个通道
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
defer ch.Close()
// 声明一个持久交换机
err = ch.ExchangeDeclare(
"my_durable_exchange", // 交换机名称
"direct", // 交换机类型
true, // durable: 交换机持久化
false, // auto-deleted
false, // internal
false, // noWait
nil, // 额外参数
)
failOnError(err, "Failed to declare an exchange")
// 发布一条持久化消息
err = ch.Publish(
"my_durable_exchange", // 交换机
"routing_key", // 路由键
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte("Hello, RabbitMQ!"),
DeliveryMode: amqp.Persistent, // 消息持久化
})
failOnError(err, "Failed to publish a message")
log.Printf(" [x] Sent a message to durable exchange")
}
小结
- 持久交换机(Durable Exchange) :RabbitMQ 重启后,交换机会继续存在。你可以使用
durable: true
来创建持久化交换机。 - 非持久交换机(Non-durable Exchange):RabbitMQ 重启后,交换机会被删除,适合临时性用途。
- 交换机持久化 和 消息持久化 是两个独立的概念。要保证可靠性,需要同时将交换机和消息设置为持久化。
持久化交换机和消息的组合对于消息系统的可靠性至关重要,特别是在生产环境中,确保消息在 RabbitMQ 重启后不会丢失。