文档管理中心

MQ消息丢失问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_39913976/article/details/102652357

MQ消息丢失问题

如何保证消息的可靠性传输


可能原因:生产者丢了,mq自己丢了,消费者丢了


1.rabbitMq

1、生产者丢数据:写消息的过程中,消息在网络传输的过程中丢失,没到mq

解决方案:

①.事务机制:同步阻塞,会降低吞吐量

channel.select();

try{

//发送消息

}catch(Exception e){

channel.txRollBack

//重试

}

channel.txCommit


②. confirm机制:基于回调,异步不阻塞。推荐使用,提升吞吐量

channel.confirm

//发送消息

//实现成功和失败的回调方法

//可以在失败的回调中重试


2、 rabbitMq丢数据:接收到消息后先暂存在内存中,在持久化到磁盘之前rabbitMq挂掉导致丢失

解决方案:设置持久化,第一创建queue的时候将其设置为持久化的,这样可以保证持久化queue的元数据,但是不会持久化queue里的数据;第二是将deliveryMode设置为2,即将消息设置为持久化。

而且持久化可以跟生产者即confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者ack了。

3、 消费者丢数据:打开了消费者autoAck机制,消费的时候还没处理完成消费者就挂掉了,但是已经通知rabbitMq这条消息处理完了。

解决方案:关闭autoAck,处理完之后发送ack给rabbitMq

kafka

1.消费端丢数据:处理完消息之前自动提交了offset,结果消费者此时挂了

解决方案:关闭自动提交offset,在处理完之后手动提交offset,就可以保证数据不丢失,但是可能会造成重复消费

2.kafka弄丢了数据:leader宕机,将follower切换为leader,leader上未同步的数据丢失

解决方案:设置4个参数

1、给topic设置repication.factor参数:使其>1,即每个partition至少有2个replica副本(1个leader,1个follower)

2、kafka服务端设置min.insync.replicas:使其>1,即要求至少有1个follower跟leader保持联系

3、producer端设置acks=all:要求数据写入所有replica之后才认为生产者发送消息成功

4、producer端设置retries=MAX:即写入失败,做无限次重试

3 生产者,如果按照上述设置,生产者不会丢失数据了


————————————————

版权声明:本文为CSDN博主「weixin_39913976」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_39913976/article/details/102652357


点赞
收藏
回复
2
分享
举报
浏览585 发布于2019-10-23 07:39未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。