【博学谷学习记录】超强总结,用心分享|架构师-RabbitMQ消息可靠性保障


消息依靠三个对象:生产者、消费者、broker
在这里插入图片描述

一、生产者保证

生产者发送消息到broker时,要保证消息的可靠性,主要的方案有:失败通知和发送方确认。

1.1 失败通知

当消息无法投递时会发送失败通知。在发送消息时设置mandatory标志,即可开启故障检测模式。

在这里插入图片描述
注意的点是,失败通知只会让 RabbitMQ 向你通知失败,而不会通知成功,如果消息正确路由到队列,则发布者不会受到任何通知,带来的问题是无法确保发布消息一定是成功的,因为通知失败的消息可能会丢失。

1.2 发送方确认

发送方确认是指生产者投递消息后,如果 Broker 接收到消息,则会给生产者一个应答,生产者进行接收应答,用来确认这条消息是否正常的发送到 Broker,这种方式也是消息可靠性投递的核心保障
rabbitmq消息发送分为两个阶段:
1、将消息发送到broker,即发送到exchage交换机
2、消息通过交换机exchange被路由到队列queue
一旦消息投递到队列,队列则会向生产者发送一个通知,如果设置了消息持久化到磁盘,则会等待消息持久化到磁盘之后再发送通知

注意:发送发确认只有出现RabbitMQ内部错误无法投递才会出现发送发确认失败。

1.3 Broker丢失消息

假设有现在一种情况,生产者已经成功将消息发送到了交换机,并且交换机也成功的将消息路由到了队列中,但是在消费者还未进行消费时,mq挂掉了,那么重启mq之后消息还会存在吗?如果消息不存在,那就造成了消息的丢失,也就不能保证消息的可靠性传输了。

	也就是现在的问题变成了如何在mq挂掉重启之后还能保证消息是存在的?

开启RabbitMQ的持久化,也即消息写入后会持久化到磁盘,此时即使mq挂掉了,重启之后也会自动读取之前存储的额数据。

二、消费方消息可靠性

2.1 消费者手动确认

消费者接收到消息,但是还未处理或者还未处理完,此时消费者进程挂掉了,比如重启或者异常断电等,此时mq认为消费者已经完成消息消费,就会从队列中删除消息,从而导致消息丢失。

那该如何避免这种情况呢?这就要用到RabbitMQ提供的ack机制,RabbitMQ默认是自动ack的,此时需要将其修改为手动ack,也即自己的程序确定消息已经处理完成后,手动提交ack,此时如果再遇到消息未处理进程就挂掉的情况,由于没有提交ack,RabbitMQ就不会删除这条消息,而是会把这条消息发送给其他消费者处理,但是消息是不会丢的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ消息可靠性是指确保消息可以安全、可靠地传递到消费者。为了实现消息可靠性RabbitMQ提供了以下机制: 1. 持久化队列:通过将队列设置为持久化,即使RabbitMQ服务器重启,队列中的消息也不会丢失。 2. 持久化消息:将消息设置为持久化,使得即使在RabbitMQ服务器重启前,消息也会被存储在磁盘上。 3. 消息确认机制:生产者可以通过消息确认机制来确保消息已经被成功发送到RabbitMQ中。当消息成功地被RabbitMQ接收到后,生产者会收到一个确认信号。如果RabbitMQ在处理消息时发生错误,生产者可以根据确认信号来重新发送消息。 尽管RabbitMQ提供了上述机制,但仍然存在一些情况下消息可能丢失的风险。例如,如果消息RabbitMQ服务器接收到但尚未持久化到磁盘上时,RabbitMQ服务器崩溃,这可能导致部分消息的丢失。 为了进一步提高消息可靠性,可以采取以下措施: 1. 使用事务:使用事务可以确保消息的原子性提交,即要么全部成功发送,要么全部失败回滚。但是,使用事务会降低RabbitMQ的性能。 2. 设置消息确认模式:可以将消息确认模式设置为"confirm",使得RabbitMQ在收到消息后立即发送确认信号给生产者。 3. 设置备份队列:备份队列可以在主队列发生故障时,将消息转发到备份队列,从而避免消息的丢失。 4. 通过持久化到数据库或其他存储系统来保存重要的消息数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值