欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > RabbitMQ入门5—exchange参数之durability

RabbitMQ入门5—exchange参数之durability

2024/10/24 23:16:02 来源:https://blog.csdn.net/LONG_Yi_1994/article/details/142730614  浏览:    关键词:RabbitMQ入门5—exchange参数之durability

在 RabbitMQ 中,durability 参数不仅可以应用于队列,也可以应用于交换机(Exchange)。durability 参数决定了 交换机(Exchange) 在 RabbitMQ 服务器重启后是否仍然存在。

durability 在 Exchange 上的作用

  1. 持久交换机(Durable Exchange)

    • durability 参数设置为 true 时,交换机会被标记为持久化。
    • 效果:RabbitMQ 服务器重启后,交换机会继续存在,不需要重新声明。
  2. 非持久交换机(Non-durable Exchange)

    • durability 参数设置为 false 时,交换机是非持久化的。
    • 效果:RabbitMQ 服务器重启后,非持久的交换机会被删除,所有绑定到该交换机的队列和路由关系也会消失。

持久交换机和消息持久化的关系

  • 交换机的持久化 只决定了交换机本身是否会在 RabbitMQ 重启后保留。
  • 消息持久化 则是另一回事,消息的持久化是通过设置 deliveryMode 来实现的。即便交换机是持久化的,消息也需要显式设置为持久化,才能在 RabbitMQ 重启后继续保留。

Go 语言中设置 Exchange 的 durability

在 Go 语言中,使用 amqp 包创建交换机时,可以通过 ExchangeDeclare 函数的 durable 参数来指定交换机的持久性。以下是一个示例:

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 代码示例,展示如何创建持久化的交换机并发布持久化消息:

package mainimport ("log""github.com/streadway/amqp"
)func failOnError(err error, msg string) {if err != nil {log.Fatalf("%s: %s", msg, err)}
}func main() {// 连接到 RabbitMQconn, 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-deletedfalse,                 // internalfalse,                 // noWaitnil,                   // 额外参数)failOnError(err, "Failed to declare an exchange")// 发布一条持久化消息err = ch.Publish("my_durable_exchange", // 交换机"routing_key",         // 路由键false,                 // mandatoryfalse,                 // immediateamqp.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")
}

小结

  1. 持久交换机(Durable Exchange):RabbitMQ 重启后,交换机会继续存在。你可以使用 durable: true 来创建持久化交换机。
  2. 非持久交换机(Non-durable Exchange):RabbitMQ 重启后,交换机会被删除,适合临时性用途。
  3. 交换机持久化消息持久化 是两个独立的概念。要保证可靠性,需要同时将交换机和消息设置为持久化。

持久化交换机和消息的组合对于消息系统的可靠性至关重要,特别是在生产环境中,确保消息在 RabbitMQ 重启后不会丢失。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com