如何保证RabbitMQ的消息可靠传输
消息丢失
在RabbitMQ的整个消息投递过程中,有三种情况下会存在消息丢失的一个问题。
第一个是生产者把消息发送到RabbitMQ Server的过程中会存在消息丢失。
第二个是RabbitMQ Server收到消息后在持久化之前宕机导致数据丢失。
第三个是消费端收到消息还没来得及处理宕机,导致RabbitMQ Server认为这个消息已签收。所以这个消息无法被重复投递,导致消息无法消费这样一个问题。
所以只需要从消息的三个维度来保证消息的可靠性去传递就可以了。
生产者端
从生产者发送消息到Server端这个角度来说,RabbitMQ提供了一个Confirm的消息确认机制,也就是生产者发送消息到Server以后,如果消息处理成功,Server端会返回一个ack的消息。那么客户端可以根据消息的处理结果来决定是否要对消息进行重新发送,从而去确保消息一定要到达RabbitMQ Server端上。
RabbitMQ Server端
从RabbitMQ Server端的角度来说,可以开启消息的持久化机制,也就是收到消息之后,持久化到磁盘里面。那么设置消息的持久化有两个步骤:
- 创建Queue的时候设置为持久化。
- 发送消息的时候把消息的投递模式设置为持久化投递。
不过虽然设置了持久化消息,但是有可能也会出现问题。比如消息刷新到磁盘之前,RabbitMQ的Server端宕机导致消息丢失的一个问题。
所以为了确保万无一失,我们需要结合confirm消息确认机制来一起使用。
消费端
从消费端的角度来看,我们把消息的自动确认机制修改成手动确认。也就是说消费端只有手动调用消息确认方法,才表示这个消息已经被签收。
那么这种方式可能会造成消息的重复消费的一个问题,所以这里需要去考虑到幂等性的一个设计。
参考资料:如何保证RabbitMQ的消息可靠传输