RabbitMQ入门指南(八):MQ可靠性

专栏导航

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、MQ数据持久化

1.交换机持久化

2.队列持久化

3.消息持久化

4.生产者确认机制

二、LazyQueue

1.LazyQueue模式介绍

2.管理控制台配置Lazy模式

3.代码配置Lazy模式

4.更新已有队列为lazy模式

总结


前言

RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容。


一、MQ数据持久化

在消息队列(MQ)中,数据的持久化至关重要。如果MQ不能及时保存消息,可能会导致数据丢失。为了确保数据的可靠性,必须配置数据持久化。

1.交换机持久化

在RabbitMQ管理控制台新建交换机时可以配置交换机的Durability参数:

  • Durable:持久化模式
  • Transient:临时模式

代码声明交换机时,默认为持久化模式,DirectExchange源码:

    public DirectExchange(String name) {super(name);}public DirectExchange(String name, boolean durable, boolean autoDelete) {super(name, durable, autoDelete);}public DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {super(name, durable, autoDelete, arguments);}

AbstractExchange源码(DirectExchange extends AbstractExchange):

    public AbstractExchange(String name) {this(name, true, false);}public AbstractExchange(String name, boolean durable, boolean autoDelete) {this(name, durable, autoDelete, (Map)null);}public AbstractExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {super(arguments);this.name = name;this.durable = durable;this.autoDelete = autoDelete;}

2.队列持久化

在RabbitMQ管理控制台新建队列时可以配置队列的Durability参数:

  • Durable:持久化模式
  • Transient:临时模式

代码声明队列时,默认为持久化模式,源码如下:

    public Queue(String name) {this(name, true, false, false);}public Queue(String name, boolean durable) {this(name, durable, false, false, (Map)null);}public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete) {this(name, durable, exclusive, autoDelete, (Map)null);}public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments) {super(arguments);Assert.notNull(name, "'name' cannot be null");this.name = name;this.actualName = StringUtils.hasText(name) ? name : Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration";this.durable = durable;this.exclusive = exclusive;this.autoDelete = autoDelete;}

3.消息持久化

在控制台发送消息的时候,可以通过配置消息的属性来实现消息的持久化。消息持久化是将消息保存在磁盘上,即使MQ重启,消息也不会丢失。在发送消息时,可以选择Delivery mode参数来配置消息的持久化属性。

查看消息:

4.生产者确认机制

在开启持久化机制以后,如果同时还开启了生产者确认,那么MQ会在消息持久化以后才发送ACK回执给生产者,进一步确保消息的可靠性。为了减少IO次数并提高性能,MQ并不会逐条将消息持久化到数据库,而是每隔一段时间批量进行持久化。因此,建议生产者确认全部采用异步方式,以避免ACK的延迟。

二、LazyQueue

1.LazyQueue模式介绍

在 RabbitMQ 的默认设置中,为了降低消息收发的延迟,它会将接收到的信息保存在内存中。然而,在某些特殊情况下,这种设置可能会导致消息积压。以下是几种可能导致消息积压的情况:

  • 消费者宕机或出现网络故障:当消费者无法正常处理消息时,RabbitMQ 将无法将消息传递给消费者,从而导致消息积压。
  • 消息发送量激增,超过了消费者处理速度:当消息发送速度超过消费者的处理速度时,消息将在 RabbitMQ 的队列中积压。
  • 消费者处理业务发生阻塞:如果消费者在处理消息时遇到业务阻塞,例如等待某些资源或进行耗时的操作,那么它可能会花费更长的时间来处理消息,从而导致消息积压。

当消息堆积问题出现时,RabbitMQ 的内存占用会逐渐增加,直到触发内存预警上限。此时,RabbitMQ 将开始将内存中的消息刷写到磁盘上,这个过程称为“PageOut”。“PageOut”过程会耗费一定的时间,并且会阻塞队列进程。因此,在这个过程中,RabbitMQ 将无法处理新的消息,导致生产者的所有请求都被阻塞。

为了解决这个问题,从 RabbitMQ 3.6.0 版本开始,引入了 Lazy Queues(惰性队列)模式。惰性队列具有以下特征:

  • 接收到消息后直接存入磁盘而非内存:在惰性队列中,消息在接收到后不会立即加载到内存中,而是直接存储在磁盘上。
  • 消费者要消费消息时才会从磁盘中读取并加载到内存(也就是懒加载):当消费者需要消费消息时,它才会从磁盘中读取消息并加载到内存中。这样可以避免在消费者不活跃时浪费内存资源。
  • 支持数百万条的消息存储:惰性队列支持大量的消息存储,即使在没有内存限制的情况下也能处理大量的消息。

在RabbitMQ 3.12 版本之后,LazyQueue 已经成为所有队列的默认格式。这种模式可以有效地解决消息积压问题,提高 RabbitMQ 的性能和稳定性。

2.管理控制台配置Lazy模式

在新建队列的时候,添加x-queue-mode=lazy参数设置队列为Lazy模式(RabbitMQ 3.12 版本之前):

3.代码配置Lazy模式

在使用Spring AMQP声明队列的时候,添加x-queue-mod=lazy参数设置队列为Lazy模式:

    @Beanpublic Queue lazyQueue() {// .lazy()开启Lazy模式return QueueBuilder.durable("lazy.queue").lazy().build();}

源码如下:

    public QueueBuilder lazy() {return this.withArgument("x-queue-mode", "lazy");}

基于注解来声明队列并设置为Lazy模式:

    @RabbitListener(queuesToDeclare = @Queue(name = "lazy.queue",durable = "true",arguments = @Argument(name = "x-queue-mode", value = "lazy")))public void listenLazyQueue(String msg){log.info("lazy.queue:{}", msg);}

4.更新已有队列为lazy模式

基于命令行设置policy实现将已有队列更新为lazy模式:

rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
rabbitmqctlRabbitMQ的命令行工具
set_policy添加一个策略
Lazy策略名称
"^lazy-queue$"用正则表达式匹配队列的名字
'{"queue-mode":"lazy"}'设置队列模式为lazy模式
--apply-to queues策略的作用对象,是所有的队列

管理控制台配置policy(RabbitMQ 3.12 版本之前):


总结

RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MaxCompute常用语句汇总(更新ing)

摘要&#xff1a; 收集一些MaxCompute常用命令。 点此查看原文&#xff1a;http://click.aliyun.com/m/41645/ 大数据计算服务(MaxCompute&#xff0c;原名ODPS&#xff0c;产品地址&#xff1a;https://www.aliyun.com/product/odps)是一种快速、完全托管的TB/PB级数据仓库解决…

290种零食大统计,谁能唤起80、90后的童年回忆?|数据会说话

戳蓝字“CSDN云计算”关注我们哦&#xff01;数据分析&#xff1a;喜欢果脯的朱小五内容撰写&#xff1a;只爱辣条的王小九本文转自公众号『凹凸数读』1块钱能买到什么&#xff1f;对于80、90后的童年来讲&#xff0c;1块钱是4根冰棍&#xff0c;是10张辣片&#xff0c;是两包双…

php socket主动推送消息,PHP使用WebSocket主动推送【微信小程序接收】

WebSocket.jpegWebsocket是一种服务端和客户端可以持久连接的通信协议&#xff0c;我们可以利用WebSocket的特性实现服务器主动向客户端推送消息的功能。这里我们用TP5.1框架结合Workerman来做演示首先用Composer下载TP5.1框架composer create-project topthink/think5.1.* tp5…

EDAS再升级!全面支持Spring Cloud应用

摘要&#xff1a; 近日&#xff0c;阿里中间件&#xff08;Aliware&#xff09;的企业级分布式应用服务EDAS宣布再次升级&#xff0c;全面支持Spring Cloud应用。 点此查看原文&#xff1a;http://click.aliyun.com/m/41644/ 近日&#xff0c;阿里中间件&#xff08;Aliware&am…

微博宕机复盘:什么样的技术架构,可支持80个明星并发出轨?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 张蓝予编辑 | 苏琦6月27日晚间&#xff0c;范冰冰李晨宣布分手&#xff0c;瞬间亿级的访问量&#xff0c;让微博再一次“崩溃”&#xff1a;范冰冰账号评论区无法加载&#xff0c;搜索“范冰冰李晨”显示失败。微博曾经夸下海…

flowable 动态多实例

<?xml version"1.0" encoding"UTF-8"?> <definitions xmlns"http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd"http://www.w3.org/2001/XMLSchema&quo…

为什么MaxCompute采用列式存储?列式存储和行式存储的主要区别在哪

摘要&#xff1a; 1 为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是如何组织表(翻译不好&#xff0c;直接抄原文了)&#xff1a; Row-based storage stores atable in a sequence …

Hive精华问答 | Hive和传统数据库有什么不同?

Hive是一个数据仓库基础工具&#xff0c;它是建立在Hadoop之上的数据仓库&#xff0c;在某种程度上可以把它看做用户编程接口&#xff08;API&#xff09;&#xff0c;本身也并不存储和处理数据&#xff0c;依赖于HDFS存储数据&#xff0c;依赖MR处理数据。它提供了一系列对数据…

MaxCompute SQL原理解析及性能调优

摘要&#xff1a; 分享内容 介绍了ODPS SQL的基于mapreduce是如何实现的及一些使用小技巧&#xff0c;回顾了mapreduce各个阶段可能产生的问题及相应的处理方法&#xff0c;同时介绍了一些应对数据倾斜的处理方法&#xff0c;最后介绍了一些关于数据集构造、特征选择的技巧帮助…

flowable用户组的处理

背景 flowable有自己的用户账号信息&#xff0c;用户信息&#xff0c;用户组信息&#xff0c;其实这些用户信息都我们系统可能都存在&#xff0c;那么我们如何去使用一份数据呢&#xff1f; 1.我们可以建立视图直接取我们的组织信息&#xff0c;这个可以参考相关的文档 2.我们…

微软 SQL Server 2019 将免费支持 Java;Rancher Labs获2500万美元融资;腾讯云进军日本市场……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go “2019世界计算机大会”新闻…

玩 High API 系列之:实现钉钉Ding功能

摘要&#xff1a; 钉钉是企业IM市场上的领先者&#xff0c;深受中小企业客户的喜欢&#xff0c;就再几天前刚刚宣布用户数超过1亿&#xff01;在钉钉里面有个特别实用的功能&#xff0c;那就是Ding一下&#xff0c;如果你发的消息特别紧急&#xff0c;可以直接通过短信、电话等…

flowable中动态显示节点的审批人信息

1、上面的流程图当任务还没有到的节点&#xff0c;用户想看看节点的人的信息&#xff0c;如果我们常规的是不能实现的。 2、思路就是我们取出节点的表达式&#xff0c;然后用我们流程实例的变量来给他翻译出来即可&#xff0c;如何做呢&#xff1f; 2.1、通过流程实例id查出历…

InfoComm China 2019,揭秘“NVIDIA风格”数据科学!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者|刘晶晶在炫酷的复联4电影中&#xff0c;超过2600个特效镜头层出不穷&#xff0c;意味着电影的后期剪辑与特效对于硬件设备的要求越发提高&#xff0c;毕竟特效制作着力依赖画面渲染。我们了解&#xff0c;在没有GPU之前&#x…

玩 High API 系列之:智能云相册

摘要&#xff1a; 相册是手机中的一个非常重要的功能&#xff0c;然而目前的大部分手机的相册非常普通&#xff0c;仅仅有查看照片&#xff0c;编辑相片的等几个简单功能。我们来看看如果在API时代&#xff0c;如何通过调用API快速实现一个好玩的&#xff0c;具备智能分析识别、…

玩 High API 系列好文:UGC内容检测、视频智能、拍照翻译、懂天气的草地喷水头...

摘要&#xff1a;玩 High API 系列好文&#xff1a;UGC内容检测、视频智能、拍照翻译、懂天气的草地喷水头 导读&#xff1a;初创公司可以利用API来解决问题。了解更多场景如何玩High API&#xff1f;如何将API变现&#xff1f;请下载阿里云 API Playbook&#xff08;免费下载&…

java项目功能详情介绍,JAVAEE—spring的详细介绍

一、spring介绍1.三层架构中spring位置2.spring一站式框架正是因为spring框架性质是属于容器性质的.容器中装什么对象就有什么功能.所以可以一站式.不仅不排斥其他框架,还能帮其他框架管理对象.aop支持、ioc思想、spring jdbc、aop 事务、junit 测试支持二、spring搭建1.导包日…

乘势而起,走进2019年风口“边缘计算”

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者| pasca原创 | 蛋蛋团&#xff08;ID&#xff1a;dandan_tuan&#xff09;5G火了&#xff0c;也带火了边缘计算。2019年3月&#xff0c;一篇《5G风口扩散&#xff0c;超清视频边缘计算概念崛起》的文章意外走红&#xff0c;直接…

详解SLB、EIP、NAT网关之间区别, 合理选择云上公网入口

摘要&#xff1a; 概述 阿里云的公网入口产品共有三个&#xff0c;SLB、EIP、NAT网关&#xff0c;这几个产品都可以作为云上资源的公网入口&#xff0c;他们之间有何区别&#xff0c;又分别应该在什么场景下使用呢&#xff1f; 点此查看原文&#xff1a;http://click.aliyun.co…

Hadoop常见问题 | Hadoop能干什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;我们很荣幸能够见证Hadoop十几年间经历了从无到有&#xff0c;再到称王。感动于技术的日新月异时&#xff0c;希望通过本篇有问有答&#xff0c;带大家解决Hadoop的常见问题。1Q&#xff1a; Hadoop 的发展历史A&#xff1a;2Q&…