h5响应式企业网站源码,高校网站集群平台子站开发,网站建设开发招标书,技术支持 昆明网站建设专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录
专栏导航
前言
一、MQ数据持久化
1.交换机持久化
2.队列持久化
3.消息持久化
4.生产者确认机制
二、LazyQueue
1.LazyQueue模式介绍
2.管理控制台配置Lazy模式
3.代码配置Lazy模式
4.更新已有队列为lazy模式
总… 专栏导航 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, MapString, 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, MapString, 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 MapString, 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-modelazy参数设置队列为Lazy模式RabbitMQ 3.12 版本之前 3.代码配置Lazy模式
在使用Spring AMQP声明队列的时候添加x-queue-modlazy参数设置队列为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策略的作用对象是所有的队列
管理控制台配置policyRabbitMQ 3.12 版本之前 总结
RabbitMQ是一个开源的消息队列软件旨在提供可靠的消息传递和消息队列功能。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容希望对大家有所帮助。