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 重启后不会丢失。

相关推荐
隐擎fox5 小时前
高性能网络爬虫架构设计:基于 Python 的长连接复用与分布式会话池调度实践
分布式·python·网络协议·tcp/ip·高并发·网络爬虫、
闲云自留地11 小时前
云平台存储管理员:Cinder 创建挂载卷 + Swift 分布式存储原理
分布式·wpf·swift
橙子圆12314 小时前
RabbitMQ知识1
分布式·rabbitmq
clz131452116 小时前
风险特征系统 EPC 子系统:基于 Kafka 数据源与数据集配置的 Flink 指标清洗加工
分布式·flink·kafka
海上小飞龙17 小时前
分布式和微服务,一次讲清
分布式·微服务·架构
(Charon)18 小时前
【Kafka】消息队列学习(二):Topic、Partition与Offset,消息到底存在哪里
分布式·学习·kafka
陈皮波比茶1 天前
分布式任务调度xxl-job
java·分布式
敲代码的嘎仔1 天前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
lauo2 天前
FDE的终极形态:从“一个人”到“一个网络”
人工智能·分布式
雾隐隐o2 天前
Kafka 集群搭建:从核心概念到多节点部署
分布式·kafka