(二)MQ避免丢失

目录

RabbitMQ如何避免丢消息

1)生产者丢消息

2)rabbitMQ丢消息

3)消费者丢消息

kafka如何避免丢消息

1)生产者丢消息

2)broker丢消息

3)消费者丢消息


一个消息的生命周期:生产者发送消息到消息队列服务器,消息队列服务器保存消息,消费者从消息队列服务器获取消息消费

RabbitMQ如何避免丢消息

1)生产者丢消息

方式一:使用rabbitMQ提供的事物机制【同步机制】

生产者发送数据之前开启rabbitmq事务(channel.txSelect),如果RabbitMQ处理失败会返回一个异常,然后生产者回滚事务(channel.txRollback),如果处理成功生产者提交事务(channel.txCommit)。

缺点:事物机制属于同步,会降低吞吐量!!

方式一:使用rabbitMQ的confirm模式【异步机制】

开启confirm模式后,如果rabbitMQ处理成功会回传一个ack消息,如果处理失败会回调一个nack接口

2)rabbitMQ丢消息

方式:消息持久化

操作步骤:

  1. 创建queue的时候将其设置为持久化的,就可以持久化queue的元数据
  2. 发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的

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

3)消费者丢消息

如果消费者刚消费完消息就挂了,此时rabbitMQ是认为你已经消费了消息的

方式:使用rabbitmq提供的ack机制

关闭rabbitmq自动ack,确认程序处理完成消费成功后再在代码中手动ack

kafka如何避免丢消息

1)生产者丢消息

  • 在producer端设置acks=all:这个是要求每条数据,必须是写入所有replica之后,才能认为是写成功了

  • 在producer端设置retries=MAX(很大很大很大的一个值,无限次重试的意思):这个是要求一旦写入失败,就无限重试,卡在这里了

2)broker丢消息

  • topic设置replication.factor参数:这个值必须大于1,要求每个partition必须有至少2个副本
  • kafka服务端设置min.insync.replicas参数:这个值必须大于1,这个是要求一个leader至少感知到有至少一个follower还跟自己保持联系,没掉队,这样才能确保leader挂了还有一个follower

3)消费者丢消息

关闭自动提交offset,在消费成功后手动提交offset

可能存在的问题:kafka消费者消费到了数据之后是写到一个内存的queue里先缓冲一下,结果有的时候,你刚把消息写入内存queue,然后消费者会自动提交offset。然后此时我们重启了系统,就会导致内存queue里还没来得及处理的数据就丢失了

猜你喜欢

转载自blog.csdn.net/lss446937072/article/details/111398572
MQ