版权声明:本文为博主原创文章,遵循 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





































苏公安网备 32011402010933号