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:[email protected]: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 重启后不会丢失。

相关推荐
RainbowSea4 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea4 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
数据智能老司机5 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机6 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记6 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周8 小时前
kafka副本同步时HW和LEO
分布式·kafka
ChinaRainbowSea9 小时前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
爱的叹息10 小时前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面11 小时前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby