如何使RabbitMQ消息稳定可靠传输,避免消息丢失呢?
下文笔者讲述讲述MQ的消息丢失概念及保证消息可靠传输的方法分享,如下所示
消息丢失的原因分享
MQ消息丢失的原因分析: MQ消息丢失可分为以下几类: 生产者丢失消息 消息列表丢失消息 消费者丢失消息
生产者丢失消息
消息的制造者,生成消息给MQ时,出现丢失 此时我们只需使用RabbitMQ提供的transaction和confirm模式 即可确保生产者不丢消息例:
transaction机制: 发送消息前,开启事务(channel.txSelect()) 然后发送消息 如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()) 如果发送成功则提交事务(channel.txCommit()) 注意事项: 这种方式会使系统吞吐量下降; confirm模式(此方法目前市面上使用的比较多): 当channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始) 一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID) 这就使得生产者知道消息已经正确到达目的队列了 如果rabbitMQ没能处理该消息,则会发送一个Nack消息给你,生产者可以进行重试操作
消息队列丢数据
MQ服务异常,使消息丢失
我们通常采用磁盘持久化的方式来避免, MQ队列丢失消息
消费者丢失消息
消费者丢失消息: 由于消费者使用自动确认消息模式 如: 消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息 处理消息失败之,再去MQ也无法拿到消息,这就是消费者丢失消息
我们只需将消息确认修改手动,并放在处理消息之后 即可解决“消费者丢失”消息,这个场景
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。