记录面试题一:RabbitMQ如何保障消息不丢失?

307 阅读2分钟

问:如何保证RabbitMQ消息的可靠传输?

造成消息不可靠(丢失)的原因主要有:

  1. 生产者丢失消息
  2. 消息列表丢失消息
  3. 消费者丢失消息

生产者丢失消息:

从生产者丢失消息这个角度来看,RabbitMQ提供ttransaction和confirm模式来确保生产者不丢消息;

transaction:

  • 原理:生产者发送消息之前,开启事务。如果发送过程中出现异常,事务就会回滚。如果发送成功,事务提交。
  • 缺点:事物一开启,就会变为同步阻塞操作,生产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。

confirm:

  • confirm用的居多,一旦进行confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID,一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达队列中;如果rabbitMQ没有处理到消息,也会发送一个Nack消息给你,就可以进行重试操作。

消息队列丢失消息:

处理消息队列丢失消息,一般就是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个ACK信号。这样的话,如果持久化磁盘之前,rabbitMQ阵亡了,生产者就收不到 ACK信号,生产者就会自动进行重发。

持久化磁盘的步骤:

  1. 将队列的持久化标识设置为true,则代表一个持久化的队列;
  2. 发送消息的时候将deliveryMode=2;

消费者丢失消息:

消费者丢失数据一般是因为采用了自动确认消息模式,改为手动确认消息即可!消费者在接收到消息后,处理消息之前,会自动回复rabbitMQ已经收到消息;如果这个时候处理消息失败,就会丢失消息;