七、消息可靠性(MQ可靠性)

0、问题

默认情况下,RabbitMQ 会将接收到的消息保存在内存中,以降低消息收发的延迟。这样会导致两个问题:

  • 一旦 MQ 宕机,内存中的消息就会丢失
  • 内存空间有限,当消费者故障或处理过慢时,会导致消息积压,引发 MQ 阻塞

在这里插入图片描述

1、数据持久化

RabbitMQ 实现数据持久化包括 3 个方面:

  1. 交换机持久化
  2. 队列持久化
  3. 消息持久化

1.1、交换机持久化

● 控制台

Durability 选为 Durable
在这里插入图片描述

● 代码

Spring AMPQ 创建交换机时默认就处理成了 持久化的。

// 创建非持久化交换机
FanoutExchange fec = (FanoutExchange)ExchangeBuilder
	.fanoutExchange("myJavaFanout2")
	.durable(false)
	.build();

1.2、队列持久化

● 控制台

Durability 选为 Durable

在这里插入图片描述

● 代码

Spring AMPQ 创建队列时默认就处理成了 持久化的。

// 创建持久化队列
Queue durQueue = QueueBuilder.durable("durQueue").build()

// 创建非持久化队列
Queue nonDurQueue = QueueBuilder.nonDurable("nonDurQueue").build()

1.3、消息持久化

● 控制台

  • 交换机发消息时 Properties 设置 delivery_mode=2

在这里插入图片描述

  • 队列发消息时将 Durability mode 选为 2 - 持久
    在这里插入图片描述

● 代码

Spring AMPQ 发送的消息默认就处理成了 持久化的。

// 创建非持久化消息
Message msg = MessageBuilder
	.withBody("message".getBytes(StandardCharsets.UTF_8))
	.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT)
	.build();

1.4、区别

● 非持久化:
在这里插入图片描述

● 持久化:

在这里插入图片描述

2、Lazy Queue

从 RabbitMQ 3.6.0 版本开始,增加了 Lazy Queue 概念,也就是 惰性队列。特征如下:

  • 接收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,默认2048条)
  • 消费者要消费消息时才从磁盘读取并加载到内存
  • 支持数百万条的消息存储

注意:在 3.12 版本后,所有队列都是 Lazy Queue 模式,且 不可更改

3.12前版本拓展:

  1. 控制台设置惰性队列

在这里插入图片描述

  1. Java 代码
Queue lazyQueue = QueueBuilder
	.durable("durQueue")
	.lazy() // 开启 Lazy 模式
	.build();
@RabbitListener(queuesToDeclare = @Queue(
	name = "myQueue666",
	durable = "true",
	arguments = @Argument(name = "x-queue-mode", value = "lazy")
))
// ...

● Lazy 效果

处理速度显著提升,效果最好。
在这里插入图片描述

3、总结

RabbitMQ 如何保证消息的可靠性?

  • 首先通过配置可以让交换机、队列一级发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ 重启消息依然存在。
  • RabbitMQ 在 3.6 版本引入了 LazyQueue,并在 3.12 版本后成为队列的默认模式切不可更改。LazyQueue 会将所有消息都持久化。
  • 开启持久化和生产者确认时,RabbitMQ 只在消息持久化完成后才会给生产者返回 ACK 回执。
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯纯的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值