【RabbitMQ】如何保证消息队列的可靠性传输

本文介绍了如何保证RabbitMQ消息的可靠性传输,主要涉及三个关键步骤:1) 生产者开启confirm模式,确保消息发送到MQ后得到确认;2) 对RabbitMQ进行持久化设置,包括交换机、队列和消息,防止数据丢失;3) 关闭自动ACK,采用手动ACK,确保消费者成功接收消息后再确认。通过以上设置,可以有效避免消息在传输过程中丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们在使用到消息队列的时候,肯定要考虑到消息队列的可靠性传输,不然的话,消息传输到一半的话消息没了,那这不是完犊子吗!所以我们必须确保消息在传输的时候不会丢失。那么面试被问到我们该怎么回答呢?

首先

我们先得明白我们要在什么地方做文章才能保证消息的可靠性,然后在细讲每一个地方该干嘛。我们先看一下整体的一个方法,如下图:
在这里插入图片描述
我们知道RabbitMQ的工作过程是生产者生产消息然后将消息放在MQ队列里进而消费者在队列里拉取消息消费。因此我们可以画出下面这张图便于我们接下来的理解。
在这里插入图片描述

第一步:生产者开启confirm模式

我们首先来看生产者这边该怎么去采取措施呢? 我们上面有看到应该是要开启一下confirm模式,其实很简单就是说消费者发送一条消息当这条消息发送到MQ时,MQ需要发一个confirm的确认消息,告诉消费者已经收到这条消息了,否则的话就是没有收到消息需要重新发送消息。如下图:
在这里插入图片描述

第二步:RabbitMQ 开启持久化

我们知道RabbitMQ中的消息是发给交换机然后交换机发给队列中,那么队列中的消息又存在于内存中,假如RabbitMQ崩了,系统重启内存中的数据就没有,消息也会不在,因此我们需要对RabbitMQ中的消息持久化到磁盘中,这样我们重启的时候就可以重新在磁盘中读取消息了。因此我们需要对交换机、队列和消息都做一个持久化处理
在这里插入图片描述

第三步:取消RabbitMQ的自动ACK

那么我们知道在做完上一步的持久化之后就确保这些信息已经是在MQ里了,那么就剩下发送给消费者了,这其实也是会出现问题的,就好比MQ把消息发送出去之后马上就会把这个消息给删除,这一过程就是自动ACK,但是好巧不巧的是消息半路丢了或者消费端崩了,消息并没有真正被消费者拿到,这个时候因为这个自动ACK了所以现在MQ里也没有了这个消息,因此就导致了消息的丢失。所以我们需要关闭自动ACK改成手动ACK,就当消费者拿到之后再告诉MQ已经收到消息了,这一步有点像生产者的confirm模式。
在这里插入图片描述

结语

好了,经过上面的三步设置之后那么就可以保证消息传输的可靠性了,此篇博客主要是为了面试,日后有时间必定会把实际的操作代码补上。
好了,收工~

### RabbitMQ 确保消息可靠性传输的最佳实践 #### 生产者确认机制 为了确保消息能成功发送至 RabbitMQ 服务器,生产者应启用确认模式。当消息被写入内存并准备投递给至少一个消费者时,RabbitMQ 将向发布者返回一条确认信息。这种方式可以有效预防因网络波动或其他异常情况造成的消息丢失[^2]。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 开启 publisher confirms 模式 channel.confirm_delivery() ``` #### 消息持久化设置 即使消息已抵达队列内部,若仅保存于内存之中,在遭遇服务崩溃的情况下仍会面临数据遗失的风险。因此建议开启消息持久化选项,使得每条记录都被同步到磁盘文件里,以此保障即便发生意外停机也能恢复未处理完毕的信息流[^3]。 ```python properties=pika.BasicProperties(delivery_mode=2,) # 设置 delivery_mode 为 2 表明该消息需要持久化 channel.basic_publish(exchange='', routing_key='task_queue', body=message, properties=properties) ``` #### 队列声明参数调整 创建队列时指定其具备持久属性同样重要,这样可使整个队列结构得以长期保留下来而不受临时性的节点重启影响。同时还可以考虑设定`x-max-priority`来支持优先级队列功能,以及利用死信交换器(`Dead Letter Exchanges`)增强系统的健壮性和灵活性。 ```python arguments={ 'x-message-ttl': 60000, # TTL (Time To Live), 单位毫秒 'x-dead-letter-exchange': 'dlx', # 死信转发给 dlx exchange } channel.queue_declare(queue='durable_queue', durable=True, arguments=arguments) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

聪明不喝牛奶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值