持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
RabbitMq消息丢失的三种情况
- 生产者往RabbitMQ中投递消息的过程中丢失。
- RabbitMQ在收到消息后,会把消息暂存到内存中,在消费之前RabbitMQ挂掉了,内存中的消息也会丢失去。
- 消费者接收到了需要消费的消息,但是处理过程中挂掉了,没有处理完毕,RabbitMQ以为消息已经被处理了。
第一种丢失情况的解决方案
- 开启RabbitMQ的事务,但是由于开启事务机制,会造成吞吐量下降,降低RabbitMQ的服务器性能。
- 开启生产者的comfirm模式,通过生产者的确认模式我们是要保证消息准确达到Broker端
- 事务针对的是多条消息,生产者的comfirm模式针对的是一条消息。事务是同步阻塞的,comfirm模式是异步回调非阻塞的。所以建议采用开启生产者的comfirm模式来解决这个问题。
第二种丢失情况的解决方案
1.我们在创建队列的时候可以设置队列为持久化队列,还要配合生产者投递消息时将消息的deliveryMode设置为持久化。达成这个两个条件队列中的消息才会持久化的磁盘中保证RabbitMQ挂掉了消息也不会丢失。
第三种修饰情况的解决方案
- 我们可以关闭RabbitMQ的自动ACK,采用手动的方式来ACK。RabbitMQ的ACK机制默认情况下当消费者接收到信息,不管消费成功与否,RabbitMQ都会自动提交ACK。我们可以采用手动ACK的方式,每次生产者接收到消息消费成功后再进行手动的ACK。但是也有一种特殊情况,就是消费成功,在ACK前消费者挂掉了,导致消息重复发送了,这种特殊情况我们对消费消息进行幂等性处理,保证重复消费不会造成问题就可以了。
谢谢观看!streetlamp敬上!