目录
问题解答
首先,在RabbitMQ的整个消息传递过程中,有三种情况会存在丢失:
1、生产者把消息发送到RabbitMQ Server的过程中丢失
2、RabbitMQ Server收到消息后在持久化之前宕机导致数据丢失
3、消费端收到消息还没来得及处理宕机,导致RabbitMQ Server认为这个消息已签收
所以,需要从这三个纬度去保证消息的可靠性传输就行了。
1、从生产者发送消息的角度来说,RabbitMQ提供了一个Confirm(消息确认)机制,生产者发送消息到Server端以后,如果消息处理成功,Server端会返回一个ack消息。客户端可以根据消息的处理结果来决定是否要做消息的重新发送,从而确保消息一定到达RabbitMQ Server上。
2、从RabbitMQ Server端来说,可以开启消息的持久化机制,也就是收到消息之后持久化到磁盘里面。
设置消息的持久化有两个步骤。
a.创建Queue的时候设置为持久化
b.发送消息的时候,把消息投递模式设置为持久化投递
不过虽然设置了持久化消息,但是有可能会出现,消息刷新到磁盘之前,RabbitMQ Server宕机导致消息丢失的问题。
所以为了确保万无一失,需要结合Confirm消息确认机制一起使用。
3、从消费端的角度来说,我们可以把消息的自动确认机制修改成手动确认,也就是说消费端只有手动调用消息确认方法才表示消息已经被签收。
这种方式可能会造成重复消费问题,所以这里需要考虑到幂等性的设计。
面试点评
保证消息的可靠性问题,不管是kafka、rocketmq、rabbitmq。
解决方法都是差不多的,而且这些消息中间件一定会提供对应的解决办法。
这个问题只是考察求职者对于MQ使用上的一些理解,考察不深,但是也是一个比较常见的问题。