首页

文章

rabbitmq保证消息不丢失?

发布网友 发布时间:2022-03-26 08:21

我来回答

2个回答

热心网友 时间:2022-03-26 09:51

我是在网上粘贴复制的。

mq原则

数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决;不能少,就是说不能丢失数据。如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的。

2.丢失数据场景

丢数据一般分为两种,一种是mq把消息丢了,一种就是消费时将消息丢了。下面从rabbitmq和kafka分别说一下,丢失数据的场景,
(1)rabbitmq
A:生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能在传输过程中因为网络等问题而将数据弄丢了。
B:rabbitmq自己丢了数据 如果没有开启rabbitmq的持久化,那么rabbitmq一旦重启,那么数据就丢了。所依必须开启持久化将消息持久化到磁盘,这样就算rabbitmq挂了,恢复之后会自动读取之前存储的数据,一般数据不会丢失。除非极其罕见的情况,rabbitmq还没来得及持久化自己就挂了,这样可能导致一部分数据丢失。
C:消费端弄丢了数据 主要是因为消费者消费时,刚消费到,还没有处理,结果消费者就挂了,这样你重启之后,rabbitmq就认为你已经消费过了,然后就丢了数据。


3.如何防止消息丢失

(1)rabbitmq



A:生产者丢失消息



①:可以选择使用rabbitmq提供是事物功能,就是生产者在发送数据之前开启事物,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会受到异常报错,这时就可以回滚事物,然后尝试重新发送;如果收到了消息,那么就可以提交事物

channel.txSelect();//开启事物try{//发送消息}catch(Exection e){channel.txRollback();//回滚事物//重新提交}复制代码

缺点: rabbitmq事物已开启,就会变为同步阻塞操作,生产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。

②:可以开启confirm模式。在生产者哪里设置开启了confirm模式之后,每次写的消息都会分配一个唯一的id,然后如何写入了rabbitmq之中,rabbitmq会给你回传一个ack消息,告诉你这个消息发送OK了;如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息失败了,你可以进行重试。而且你可以结合这个机制知道自己在内存里维护每个消息的id,如果超过一定时间还没接收到这个消息的回调,那么你可以进行重发。

//开启confirmchannel.confirm();//发送成功回调public void ack(String messageId){}// 发送失败回调public void nack(String messageId){//重发该消息}复制代码

二者不同 事务机制是同步的,你提交了一个事物之后会阻塞住,但是confirm机制是异步的,发送消息之后可以接着发送下一个消息,然后rabbitmq会回调告知成功与否。 一般在生产者这块避免丢失,都是用confirm机制。
B:rabbitmq自己弄丢了数据 设置消息持久化到磁盘。设置持久化有两个步骤:
①创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里面的数据。
②发送消息的时候讲消息的deliveryMode设置为2,这样消息就会被设为持久化方式,此时rabbitmq就会将消息持久化到磁盘上。 必须要同时开启这两个才可以。

而且持久化可以跟生产的confirm机制配合起来,只有消息持久化到了磁盘之后,才会通知生产者ack,这样就算是在持久化之前rabbitmq挂了,数据丢了,生产者收不到ack回调也会进行消息重发。
C:消费者弄丢了数据 使用rabbitmq提供的ack机制,首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。

热心网友 时间:2022-03-26 11:09

流量削峰:通过消息队列设置请求最大值,超过阀值的抛弃或者转到错误界面

所有的MQ都不能做到永不丢失吧

使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 分布式、中间件和消息队列到底是怎么的一种工作模式? rabbitmq可以支持多少个消费者同时监听 net redis 和rabbitmq 有什么区别 rabbit消息队列是推还是拉模式 RabbitMQ怎样能实现多个队列由一个消费者来接收消息 rabbitmq的镜像集群模式如何实现线性扩容? rabbitmq与kafka到底用哪个好 rabbitmq和kafka的区别 Rabbitmq 和 Celery 是怎样工作的 rabbitmq一共有几种模式 大家觉得华为荣耀9青春版怎么样 华为荣耀9青春版怎么样 华为荣耀9和9青春版哪个好 华为荣耀和华为荣耀青春版有什么区别 华为Nova青春版和华为 荣耀9有什么区别 华为荣耀9青春版怎么样? 华为荣耀9青春版多少钱 华为荣耀9青春版配置一览 华为荣耀和华为荣耀青春版有什么区别? 荣耀9和荣耀9青春版的区别 华为荣耀9青春版参数配置? 我为什么要选择RabbitMQ 请问kafka和rabbitmq有啥区别啊? rabbitmq中,使用一个exchange和使用多个exchange,性能会有差别吗 rabbitmq 怎么设置集群发送 ip zookeeper与rabbitmq有什么不同 rabbitmq使用haproxy哪个算法 kafkaMQ,rabbitMQ怎么选择 如何重启宽带路由器? 如何重启电脑上的路由器和光猫? 路由器没有复位开关,那怎么复位 光猫路由器怎么重启 华为荣耀路由器怎么重启 路由器没有开关,如何重启 路由器没有reset键,连孔都没有,我该怎么重启啊? 手机把图片白底变透明 手机美图秀秀怎么叠图透明 手机ps怎么做透明图片 怎么用手机制作透明图片 如何在手机上把图片做成透明的?并不是全透明,而是把自己想要透明的部分做透明。 手机有什么软件可以制作透明图片或者把图片透明,谢谢
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com