当前位置:   article > 正文

rabbitmq怎么解决消息丢失问题?_如何处理mq的消息丢失

如何处理mq的消息丢失

以rabbitmq举例,要解决rabbitmq消息丢失问题我们要先知道rabbitmq的三个环节,针对每个环节去保证消息可靠性就可以真正解决mq的消息丢失问题。
第一个环节:生产者向服务器投递消息。在投递的过程当中可能因为服务器宕机或网络抖动的原因导致mq 实际上并没有收到消息,这个时候如果我们不管的话就意味着这条消息就丢失了。所以就需要一个消息确认机制来保证消息不丢失,也就是说我们生产者需要收到一条消息确认的通知。
1.生产者香服务器投递消息环境如何开启消息确认机制?
通过channl的confirmSelect 的方法来开启发送消息的确认模式,以及再点用channel 的addconfirmList方法去添加一个监听器,他有两个方法去实现,分别为handleACK与handleNACK方法来进行不同的实现和处理,比如消息ACK可以做一些后续的逻辑处理,NACK用于设置一些失败重发策略,通常大部分mq默认重发次数为6次,NACK就包括可以设置重发次数及间隔时间等等。比如6次后仍然没有发送成功,那我我们就认为他发送失败了,但对于非常重要的信息即使重发失败我们也不能让他丢失,就可以将消息持久化到数据库,一开始我们可以设置为0,也就是发送失败的消息标识,当服务端成功接收到消息后的话会触发回调,这个时候我们再将状态改为1。这里我们还需要提供一个消失失败的补偿机制,也就是写一个定时器去轮询我们发送失败的消息进行重新投递,也要设置一个最大的投递次数去防止一条消息出现不断的重试,从而导致消耗内存资源。这里要注意会加大一个数据库的交互压力,可以选择分库分表进行优化,去创建一个专门的数据库用于存放这些发送失败的消息,这样也就不会影响正常数据库的一个业务。也可以通过redis缓存来更新消息的投递状态,这样就可以减轻数据库的轮询压力也同时能保证生产者在投递消息时的一个可靠性了。
2.第二个环节服务器存储消息又怎么去确保消息的可靠性?
mq服务端在成功收到休息后的消息存储。MQ在收到消息后是将消息存在内存当中的,这个时候如果服务挂了或者我们将服务重启了且内存中还存在未消费的消息的话,那么缓存当中的消息就不存在了,针对这个问题我们就需要将消息持久化,那么rabbitMq的持久化机制是通过raid刷盘来实现的,有两种但是分别为raid0和raid1。raid0是指将我们的磁盘集成为一块来使用,该方式可以提高我们一个磁盘存储量。而raid1就是我们的磁盘镜像,也就是将磁盘分割成两部分来分别存储同一份消息,可以理解为复制,这种方式就不用担心哪块磁盘坏了等问题导致消息丢失。在代码中我们需要将rabbit交换机与队列的一个布尔类型参数都设置为true,并传递开启持久化的参数给发布消息的方法。只有当这三个参数都开启持久化后才会保证消息是完全持久化的。
3.第三个环节消费则消费消息如何去确保消息可靠性?
解决方案跟第一个环节一样开启消息确认机制就可以了,mq给消费者提供了一种手动ACK的机制,也就是说我们只需要在消费者成功消费消息后进行手动确认,当服务器没有收到消息确认或者说等待消息确认超时了就会触发重试机制。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/597448
推荐阅读
相关标签
  

闽ICP备14008679号