RabbitMQ入门4—queue参数之durability

ops/2024/10/18 10:46:39/

在 RabbitMQ 中,durability 参数用于控制队列是否能够在服务器重启后继续保持存在,以及队列中的消息是否能够持久化。了解这个参数有助于确保消息系统的可靠性和持久性。

Durability 参数的详细说明

durability 参数决定了 队列本身 是否会在 RabbitMQ 服务器重启后继续存在。它与消息的持久化是不同的概念,两者都需要正确配置才能保证消息的可靠持久存储。

1. 队列的持久性(Durability)
  • 持久队列(Durable Queue)
    • durability 参数设置为 true 时,队列被标记为持久队列。
    • 效果:即使 RabbitMQ 服务器重启,这个队列仍然会存在,队列不会丢失。
  • 非持久队列(Non-durable Queue)
    • durability 参数设置为 false 时,队列是非持久的。
    • 效果:RabbitMQ 服务器重启后,非持久队列会丢失,所有之前的队列定义和队列中的消息都不再存在。
2. 消息的持久性(Persistence)
  • 消息的持久化 与队列的 durability 是两个不同的概念。即使队列是持久的,消息本身也必须设置为持久化,才能确保在 RabbitMQ 重启后消息仍然存在。
  • 消息持久化需要通过在发布消息时将 deliveryMode 设置为持久化(2)来实现。

队列 durability 和消息持久化的组合

RabbitMQ 的消息持久化和队列持久性共同决定了系统的整体可靠性。以下是可能的组合和对应的行为:

  1. 持久队列 + 持久消息

    • 队列:队列在 RabbitMQ 重启后会继续存在。
    • 消息:队列中的消息也会在 RabbitMQ 重启后保留。
    • 使用场景:这是确保消息系统可靠性和持久化的最佳选择,适合需要高可靠性的生产环境。
  2. 持久队列 + 非持久消息

    • 队列:队列在 RabbitMQ 重启后会继续存在。
    • 消息:消息不会持久化,RabbitMQ 重启后消息会丢失。
    • 使用场景:适合需要队列长期存在,但消息本身不需要持久化的场景。
  3. 非持久队列 + 持久消息

    • 队列:队列在 RabbitMQ 重启后会丢失。
    • 消息:即使消息设置为持久化,由于队列已丢失,消息也无法恢复。
    • 使用场景:这种组合在大多数场景下没有实际意义,因为一旦队列丢失,持久化的消息也无从恢复。
  4. 非持久队列 + 非持久消息

    • 队列:队列在 RabbitMQ 重启后会丢失。
    • 消息:消息也不会持久化,RabbitMQ 重启后消息和队列都会丢失。
    • 使用场景:适用于消息临时性很强、不需要持久化的场景,比如临时数据或瞬时任务处理。

Go 语言中设置 durability

在使用 Go 语言的 amqp 包时,durability 参数通过 QueueDeclare 方法进行配置。以下是一个示例:

q, err := ch.QueueDeclare("my_durable_queue", // 队列名称true,   // durable: 设置为 true 表示队列持久化false,  // delete when unusedfalse,  // exclusivefalse,  // no-waitnil,    // arguments
)

在这个示例中,durable 设置为 true,表示队列是持久化的。如果 RabbitMQ 重启,这个队列将继续存在。

消息持久化示例

为了让消息也持久化,除了声明持久队列外,还需要在发布消息时设置消息的 DeliveryMode2,如下所示:

err = ch.Publish("",     // exchangeq.Name, // routing keyfalse,  // mandatoryfalse,  // immediateamqp.Publishing{ContentType: "text/plain",Body:        []byte("Hello, RabbitMQ!"),DeliveryMode: amqp.Persistent, // 消息持久化})
  • DeliveryMode: amqp.Persistent:设置消息的 deliveryMode2,表示该消息是持久化的,RabbitMQ 重启后消息不会丢失。

持久队列 vs. 非持久队列

属性持久队列(Durable Queue)非持久队列(Non-durable Queue)
队列是否保留是,RabbitMQ 重启后队列仍然存在否,RabbitMQ 重启后队列会丢失
消息是否保留仅在消息持久化时保留RabbitMQ 重启后所有消息都会丢失
适用场景需要队列和消息长时间存在的场景短期或临时消息处理的场景

注意事项

  1. 持久队列不等于持久消息

    • durable 只保证队列的持久性,消息还需要单独设置为持久化(deliveryMode 设置为 2),才能确保 RabbitMQ 重启后消息仍然存在。
  2. 持久化操作的性能开销

    • 持久队列和持久消息虽然提供了高可靠性,但会带来一定的性能开销,因为消息和队列元数据都需要写入磁盘。
  3. 持久化的队列和消息会增加磁盘使用

    • RabbitMQ 需要将持久化队列和消息存储到磁盘,因此你需要确保磁盘空间足够。

总结

  • durability:控制队列的持久性,决定了 RabbitMQ 重启后队列是否继续存在。
  • 消息持久化:消息需要单独设置持久化,以确保 RabbitMQ 重启后消息不会丢失。
  • 使用 持久队列持久消息 是确保消息系统高可靠性的重要配置。

http://www.ppmy.cn/ops/124266.html

相关文章

vite学习教程04、vue集成axios封装request工具类及应用

文章目录 前言1、安装axios2、封装request工具类3、封装api请求工具4、实战:vue中使用api请求工具类资料获取 前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

2024年9月30日--10月6日(ue5肉鸽结束,20小时,共2851小时)

按照月计划,本周把ue肉鸽游戏完成,然后进行ue5太阳系 , 剩余14节,218分钟,如果按照10分钟的视频教程1小时进行完的话,则需要22小时,分布在10月2日-10月6日之间,每天44分钟的视频教程…

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…

原生input实现时间选择器用法

2024.10.08今天我学习了如何用原生的input&#xff0c;实现时间选择器用法&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <div><input id"yf_start" type"text"> </div><script>$(#yf_start).datepicker({language: zh…

英语中 ing后缀

在英语中&#xff0c;“-ing” 后缀通常用于形成动名词和现在分词。以下是 “-ing” 后缀的两种主要用途&#xff1a; 动名词&#xff08;Gerund&#xff09;&#xff1a; 动名词是动词的一种形式&#xff0c;它同时具有动词和名词的特性。它可以作为主语、宾语或表语使用。 例…

PHP函数 func_num_args() 的作用

func_num_args() 是 PHP 中的一个内置函数&#xff0c;用于获取传递给当前用户定义函数&#xff08;UDF&#xff0c;User-Defined Function&#xff09;的参数数量。这个函数在编写需要处理可变数量参数的函数时非常有用。 语法 int func_num_args ( void ) 返回值 该函数返…

Chromium 中chrome.cookies扩展接口c++实现分析

chrome.cookies 使用 chrome.cookies API 查询和修改 Cookie&#xff0c;并在 Cookie 发生更改时收到通知。 更多参考官网定义&#xff1a;chrome.cookies | API | Chrome for Developers (google.cn) 本文以加载一个清理cookies功能扩展为例 https://github.com/Google…