page contents

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

轩辕小不懂 发布于 2021-09-01 15:38
阅读 604
收藏 0
分类:中间件
1825
Nen
Nen
- 程序员

消息不可靠的情况可能是消息丢失,劫持等原因

丢失又分为:

生产者丢失消息

消息列表丢失消息

消费者丢失消息

生产者丢失消息:

从生产者弄丢数据这个角度来看,RabbitMQ提供transaction机制和confirm模式来确保生产者不丢消息;

transaction机制:发送消息前,开启事务(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit())。

confirm模式(用的居多):一旦channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后;RabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了;

如果RabbitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行重试操作。


消息队列丢数据:

消息持久化,处理消息队列丢数据的情况,一般是开启持久化磁盘的配置:

将队列的持久化标识durable设置为true,则代表是一个持久的队列 发送消息的时候将 deliveryMode=2 这样设置以后,即使RabbitMQ挂了,重启后也能恢复数据


消费者丢失消息:

消费者丢数据一般是因为采用了自动确认消息模式,改为手动确认消息

消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;如果这时处理消息失败,就会丢失该消息;

解决方案:处理消息成功后,手动回复确认消息。

请先 登录 后评论