问:如何保证RabbitMQ消息的可靠传输?
造成消息不可靠(丢失)的原因主要有:
- 生产者丢失消息
- 消息列表丢失消息
- 消费者丢失消息
生产者丢失消息:
从生产者丢失消息这个角度来看,RabbitMQ提供ttransaction和confirm模式来确保生产者不丢消息;
transaction:
- 原理:生产者发送消息之前,开启事务。如果发送过程中出现异常,事务就会回滚。如果发送成功,事务提交。
- 缺点:事物一开启,就会变为同步阻塞操作,生产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。
confirm:
- confirm用的居多,一旦进行confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID,一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达队列中;如果rabbitMQ没有处理到消息,也会发送一个Nack消息给你,就可以进行重试操作。
消息队列丢失消息:
处理消息队列丢失消息,一般就是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个ACK信号。这样的话,如果持久化磁盘之前,rabbitMQ阵亡了,生产者就收不到 ACK信号,生产者就会自动进行重发。
持久化磁盘的步骤:
- 将队列的持久化标识设置为true,则代表一个持久化的队列;
- 发送消息的时候将deliveryMode=2;
消费者丢失消息:
消费者丢失数据一般是因为采用了自动确认消息模式,改为手动确认消息即可!消费者在接收到消息后,处理消息之前,会自动回复rabbitMQ已经收到消息;如果这个时候处理消息失败,就会丢失消息;