前言
我们在使用到消息队列的时候,肯定要考虑到消息队列的可靠性传输,不然的话,消息传输到一半的话消息没了,那这不是完犊子吗!所以我们必须确保消息在传输的时候不会丢失。那么面试被问到我们该怎么回答呢?
首先
我们先得明白我们要在什么地方做文章才能保证消息的可靠性,然后在细讲每一个地方该干嘛。我们先看一下整体的一个方法,如下图:
我们知道RabbitMQ的工作过程是生产者生产消息然后将消息放在MQ队列里进而消费者在队列里拉取消息消费。因此我们可以画出下面这张图便于我们接下来的理解。
第一步:生产者开启confirm模式
我们首先来看生产者这边该怎么去采取措施呢? 我们上面有看到应该是要开启一下confirm模式,其实很简单就是说消费者发送一条消息当这条消息发送到MQ时,MQ需要发一个confirm的确认消息,告诉消费者已经收到这条消息了,否则的话就是没有收到消息需要重新发送消息
。如下图:
第二步:RabbitMQ 开启持久化
我们知道RabbitMQ中的消息是发给交换机然后交换机发给队列中,那么队列中的消息又存在于内存中,假如RabbitMQ崩了,系统重启内存中的数据就没有,消息也会不在,因此我们需要对RabbitMQ中的消息持久化到磁盘中,这样我们重启的时候就可以重新在磁盘中读取消息了。因此我们需要对交换机、队列和消息都做一个持久化处理
。
第三步:取消RabbitMQ的自动ACK
那么我们知道在做完上一步的持久化之后就确保这些信息已经是在MQ里了,那么就剩下发送给消费者了,这其实也是会出现问题的,就好比MQ把消息发送出去之后马上就会把这个消息给删除,这一过程就是自动ACK,但是好巧不巧的是消息半路丢了或者消费端崩了,消息并没有真正被消费者拿到,这个时候因为这个自动ACK了所以现在MQ里也没有了这个消息,因此就导致了消息的丢失。所以我们需要关闭自动ACK改成手动ACK,就当消费者拿到之后再告诉MQ已经收到消息了,这一步有点像生产者的confirm模式。
结语
好了,经过上面的三步设置之后那么就可以保证消息传输的可靠性了,此篇博客主要是为了面试,日后有时间必定会把实际的操作代码补上。
好了,收工~