网站首页 > 技术文章 正文
首先我们来讨论一下MQ数据丢失的场景
1.生产者丢失消息
第一种情况就是生产者丢失消息,生产者生产了消息在传递的过程中把消息弄丢了
2.MQ队列丢失了消息
rabbitmq重启后,之前的数据丢失了。所以必须开启持久化将消息持久化到磁盘,这样就算rabbitmq挂了,恢复之后会自动读取之前存储的数据,一般数据不会丢失。除非极其罕见的情况,rabbitmq还没来得及持久化自己就挂了,这样可能导致一部分数据丢失。
3.消费者丢失消息
消费者消费时,刚拿到消息,还没有处理,结果消费者就挂了,消费者重启之后,rabbitmq就认为你已经消费过了,然后就丢了数据。
如何防止消息的丢失呢?
1:生产者丢失消息
第一种解决办法我们可以开启事务功能,
可以选择使用rabbitmq提供的事物功能,就是生产者在发送数据之前开启事物,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会受到异常报错,这时就可以回滚事物,然后尝试重新发送;如果收到了消息,那么就可以提交事物。
channel.txSelect();//开启事物
try{
}catch(Exection e){
channel.txRollback();//回滚事物
//重新提交
}
缺点:rabbitmq事物一旦开启,就会变为同步阻塞操作,生产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。这有点违背我们的初衷了。
第二种办法是开启confirm模式,
在生产者开启了confirm模式之后,每次写的消息都会分配一个唯一的id,然后如何写入了rabbitmq之中,rabbitmq会给你回传一个ack消息,告诉你这个消息发送OK了;如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息失败了,你可以进行重试。而且你可以结合这个机制知道自己在内存里维护每个消息的id,如果超过一定时间还没接收到这个消息的回调,那么你可以进行重发。
//开启confirm
channel.confirm();
//发送成功回调
public void ack(String messageId){
}
// 发送失败回调
public void nack(String messageId){
//重发该消息
}
事务机制是同步的,你提交了一个事物之后会阻塞住,但是confirm机制是异步的,发送消息之后可以接着发送下一个消息,然后rabbitmq会回调告知成功与否。
一般在生产者这块避免丢失,都是用confirm机制。
2.MQ丢失了消息
我们说了对于mq丢失消息的话我们可以开启mq的持久化,而且持久化和生产者的confirm机制配合起来,只有消息持久化到了磁盘,才会个生产者发送ack,这样就算是在持久化之前rabbitmq挂了,数据丢了,生产者收不到ack回调也会进行消息重发。
3.消费者丢失消息
使用rabbitmq提供的ack机制,首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。
猜你喜欢
- 2024-10-02 「2021最新版」RabbitMQ面试题总结,每道题都很经典
- 2024-10-02 用 RabbitMQ 延迟队列,实现消息延迟推送
- 2024-10-02 RabbitMQ如何保证消息不丢失? 山西丢失孩子最新消息
- 2024-10-02 超详细的RabbitMQ入门,看这篇就够了
- 2024-10-02 3分钟阅读技术干货,一步一步的理解RabbitMQ
- 2024-10-02 周日福利--消息队列学习必备宝典(RabbitMQ实战指南)
- 2024-10-02 RabbitMQ 如何实现数据100%不丢失
- 2024-10-02 C# 消息队列之RabbitMQ rabbitmq消息队列类型
- 2024-10-02 RabbitMQ 持久化和权重分配消息 rabbitmq的持久化和确认机制
- 2024-10-02 RabbitMQ如何防止消息丢失和重复消费
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)