RabbitMQ学习七 RabbitMQ的可靠性
默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样做可能对导致两个问题:
-
一旦MQ宕机,内存中的消息会丢失
-
要解决上述两个问题,RabbitMQ给出了两个解决方案:数据持久化和Lazy Queue。
数据持久化是3.6之前提出的,3.6之后RabbitMQ又提出了Lazy Queue。
一、数据持久化
数据持久化可以包括三个方面:
交换机持久化:在创建交换机时,可以把交换机设置成Durable
队列持久化: 在创建队列时,可以把队列设置成Durable
消息持久化: 在发送消息时,DeliveryMode 选择2
开启生产者确认时,此时每秒只能接收600
@RequestMapping("/sendMessageConfirmRate")
public String sendMessageConfirmRate(){
Message message = MessageBuilder
.withBody("hello".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
.build();
for(int i=0;i<1000000;i++){
rabbitTemplate.convertAndSend("simple_queue",message);
}
return "ok";
}
关闭生产者确认
从上图中也可以看到,当发送临时消息很快时,会造成Paged Out,当Paged Out发生时,会造成MQ无法接收消息。
把上述队列中的消息清空,测试持久化队列的测试。
@RequestMapping("/sendMessageConfirmRate")
public String sendMessageConfirmRate(){
Message message = MessageBuilder
.withBody("hello".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.PERSISTENT)
.build();
for(int i=0;i<1000000;i++){
rabbitTemplate.convertAndSend("simple_queue",message);
}
return "ok";
}
二、Lazy Queue
从RabbitMQ的3.6.0版本开始就增加了Lazy Queue的概念,也就是惰性队列。
惰性队列的特征如下:
-
接收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,默认2048条)
-
只有在消费者需要消费消息时才会从磁盘中读取并加载到内存
-
支持数百万条的消息存储。
/**
* 声明一个简单的队列
* @return
*/
@Bean("lazyQueue")
public Queue lazyQueue(){
return QueueBuilder
.durable("lazy.queue")
.lazy()
.build();
}
或者在监听时声明
@RabbitListener(queuesToDeclare = @Queue(
name = "lazy.queue",
durable = "true",
arguments = @Argument(name = "x-queue-mode",value = "lazy")
))
public void listenLazyQueue(String msg){
System.out.println("消费消息"+msg);
}
一百万消息实验
@RequestMapping("/sendMessageConfirmRate")
public String sendMessageConfirmRate(){
Message message = MessageBuilder
.withBody("hello".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
.build();
for(int i=0;i<1000000;i++){
rabbitTemplate.convertAndSend("lazy.queue",message);
}
return "ok";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理