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

相关推荐
学习中.........3 分钟前
高并发架构下的 Kafka 与消息队列核心机制
分布式·kafka
Han.miracle7 分钟前
分布式部署项目
分布式
努力努力再努力wz14 分钟前
【Redis 入门系列】为什么需要 Redis?一文串起缓存、分布式、读写分离、分库分表与微服务
数据库·redis·分布式·sql·mysql·缓存·微服务
逆境不可逃23 分钟前
黑马 RabbitMq 基础篇 学习记录
学习·rabbitmq·ruby
番茄去哪了42 分钟前
单体转微服务:微服务保护和分布式事务(上)
分布式·微服务·架构
念何架构之路1 小时前
分布式详解
分布式
Elastic 中国社区官方博客1 小时前
将 Logstash Pipeline 从 Azure Event Hubs 迁移到 OTel Collector Kafka Receiver
大数据·数据库·人工智能·分布式·elasticsearch·搜索引擎·kafka
倒流时光三十年1 小时前
第1篇:你真的了解 Kafka 吗?—— 破冰篇
spring boot·分布式·kafka·linq
隔窗听雨眠10 小时前
从DNS解析到分布式存储的技术解构
分布式·网关·cdn·dns·socks
gQ85v10Db14 小时前
Redis分布式锁进阶第二十二篇
数据库·redis·分布式