RabbitMQ消息丢失以及解决策略
1、消息丢失
1.1、RabbitMQ流程
producer——》RabbitMQ——》consumer
SO:发生消息丢失的三种情况:
- producer端:发送消息过程中出现网络问题:producer以为发送成功,但RabbitMQ server没有收到;
- RabbitMQ server 端:接收到消息后由于服务器宕机或其他原因(消息默认存在内存中)导致消息丢失;
- Consumer端:Consumer端接收到消息后处理消息出错,没有完成消息的处理;
1.2、producer端
解决方式:
- 事务:在生产者发送数据之前开启rabbitmq事务(channel.txSelect),然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务(channel.txRollback),然后重试发送消息;如果收到了消息,那么可以提交事务(channel.txCommit)。
- 缺点:耗费性能,效率低。
- 回执确认:开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。而且你可以结合这个机制自己在内存里维护每个消息id的状态,如果超过一定时间还没接收到这个消息的回调,那么你可以重发。
区别:
事务是同步的,会发生阻塞;
confirm是异步的,效率更高;
1.3、RabbitMQ Server端
解决方式:
- 消息持久化
- RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失。
要想做到消息持久化,必须满足以下三个条件,缺一不可。
- Exchange 设置持久化:durable:true
- Queue 设置持久化:durable:true
- Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息
1.4、Consumer端
解决方法:
- ACK确认机制:
- 多个消费者同时收取消息,比如消息接收到一半的时候,一个消费者死掉了(逻辑复杂时间太长,超时了或者消费被停机或者网络断开链接),如何保证消息不丢?
这个使用就要使用Message acknowledgment 机制,就是消费端消费完成要通知服务端,服务端才把消息从内存删除。
这样就解决了,及时一个消费者出了问题,没有同步消息给服务端,还有其他的消费端去消费,保证了消息不丢的case。
具体步骤:
- 多个消费者同时收取消息,比如消息接收到一半的时候,一个消费者死掉了(逻辑复杂时间太长,超时了或者消费被停机或者网络断开链接),如何保证消息不丢?
- 交换机调用basicQos(1)方法:告诉RabbitMQ 不采用以前那种实现分配好的模式进行消息推送,而是每次只推送一条。
- 调用basicAck()方法手动回复ack消息
- 调用basicconsume()方法时将第二个参数写为false(开启手动ACK)
- mq收到ack消息会删除当前的消息。没收到会等待一段时间然后将重新发送该消息。
消息重复
原因
- 消费者端在消费完成后,手动ack发出,但是由于网络原因mqServer没有收到。so mq保留此条消息而后被重复消费。
- 生产者端发送消息,mqServer收到消息返回回执确认同样因为网络等原因生产者端并没有收到。再次发送同一条消息。
消息乱序
比如说生产者发送了两条消息:消息一:添加一条数据;消息二:修改这条数据;然而mq收到消息后发给消费者的顺序是不能保证的。有可能消费者先收到消息二;
- so 如何解决呢?
- 很简单:将这种带有先后顺序的消息发送到同一个队列中,这样它的顺序是肯定的。
RabbitMQ消息丢失以及解决策略相关推荐
- rabbitmq可靠性投递_解决RabbitMQ消息丢失问题和保证消息可靠性(一)
工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠性如何保证一直是个很大的问题,什么情况下消息就不见了?如何防止消息丢失?下面通过这篇文章,我们就聊聊RabbitMQ 消 ...
- 解决RabbitMQ消息丢失与重复消费问题
解决RabbitMQ消息丢失与重复消费问题 参考文章: (1)解决RabbitMQ消息丢失与重复消费问题 (2)https://www.cnblogs.com/sessionbest/articles ...
- rabbitMQ消息丢失、重复消费解决方案
消息丢失 生产者端丢失 ① RabbitMQ 事务机制(同步) ② 开启 confirm 模式(异步效率高) 设置开启 confirm 模式之后,你每次写的消息都会分配一个唯一的 id,然后如果写入了 ...
- active mq topic消费后删除_RabbitMQ重复消费,顺序消费,消息丢失如何解决
MQ的优势 异步 解耦 削峰 不同MQ的优缺点 特性 RabbitMQ ActiveMQ RocketMQ Kafka 单机吞吐量 万级 万级 十万级 十万级 topic数量对吞吐量影响 topic达 ...
- 解决RabbitMQ消息丢失问题和保证消息可靠性
参考文章:https://www.liangzl.com/get-article-detail-140885.html
- RabbitMQ如何防止消息丢失及重复消费
RabbitMQ目录 文章目录 RabbitMQ如何防止消息丢失及重复消费 一.消息丢失 1.1.生产者没有成功把消息发送到MQ 1.1.1.confirm(发布确认)机制 1.1.2.事务机制 1. ...
- RabbitMQ 入门系列(6)— 如何保证 RabbitMQ 消息不丢失
1. 消息丢失源头 RabbitMQ 消息丢失的源头主要有以下三个: 生产者丢失消息 RabbitMQ 丢失消息 消费者丢失消息 下面主要从 3 个方面进行说明并提供应对措施 2. 生产者丢失消息 R ...
- 详解,最新整理,RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略
消息队列常见问题处理 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用 ...
- RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略
消息队列常见问题处理 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用 ...
最新文章
- Redis集群Twemproxy
- matlab多维数组、结构体数组
- c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
- c++ 实例精通(1)
- Git 学习笔记:自定义Git(完)
- html浏览器引擎表示,html – Web浏览器引擎和特殊字符呈现
- text-indent的用法
- Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
- mac下多个php版本快速切换的方法
- visual studio 2015 2017 key vs2015 vs2017密钥
- 腾讯同事要跳槽,问我背包问题具体咋回事,我直接甩给他这篇!
- docker-compose简单使用
- android 外接键盘 五笔 百度输入法
- Access与Trunk
- linux命令清理磁盘空间,Unix/Linux中常用的清理磁盘空间的命令
- 日语学习网站分类汇总
- QQ等App每天自启百次;​李国庆直播拍卖午餐时间1小时;苹果提交认证9款新手机 | EA周报...
- Python 智能项目:1~5
- 教师节,回忆一点(更新完毕)
- uClinux移植概述