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 参数来指定交换机的持久性。以下是一个示例:

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")
}

小结

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

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

相关推荐
前端世界9 小时前
鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
分布式·华为·harmonyos
A尘埃10 小时前
金融项目高可用分布式TCC-Transaction(开源框架)
分布式·金融·开源
夜影风11 小时前
RabbitMQ核心架构与应用
分布式·架构·rabbitmq
电商API_1800790524716 小时前
大规模调用淘宝商品详情 API 的分布式请求调度实践
服务器·数据库·分布式·爬虫
Light601 天前
模型驱动与分布式建模:技术深度与实战落地指南
分布式·生成式ai·元模型·crdt·模型驱动架构·分布式建模
斯普信专业组1 天前
Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
分布式·kubernetes·rabbitmq
愚昧之山绝望之谷开悟之坡2 天前
Kafka 的消费
分布式·kafka
BD_Marathon2 天前
Kafka下载和安装
分布式·kafka
泰勒疯狂展开2 天前
Java研学-RabbitMQ(八)
java·rabbitmq·java-rabbitmq
Monly212 天前
RabbitMQ:Windows版本安装部署
rabbitmq