关系经济人类预测化学自然
中准网
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

RabbitMQ消息丢失消息积压原因解决方案私人心得

6月10日 遭人厌投稿
  一、前言首先说一点,企业中最常用的实际上既不是RocketMQ,也不是Kafka,而是RabbitMQ。
  RocketMQ很强大,但主要是阿里推广自己的云产品而开源出来的一款消息队列,其实中小企业用RocketMQ的没有想象中那么多。
  深层次的原因在于兔宝在中小企业普及更早,经受的考验也更久,很容易产生回头客,当初随RabbitMQ成长的一批人才如今大部分都已成为企业中的中坚骨干,技术选型亲睐RabbitMQ的几率就更高。
  至于Kafka,主要还是用在大数据和日志采集方面,除了一些公司有特定的需求会使用外,对消息收发准确率要求较高的公司依然是以RabbitMQ作为企业级消息队列的首选。
  工作这么多年我自身的感受是,RabbitMQ经久不衰,除非后续其他消息中间件有与众不同的使用体验,否则依然是RabbitMQ的占有率更高。
  所以准备进入软件行业的小伙伴,我建议有必要系统的先把RabbitMQ学好,然后再学习其他消息中间件扩展视野,他们的原理大同小异,是可以触类旁通的。
  二、两个概念
  RabbitMQ避免消息丢失的方法主要是利用消息确认机制和手动签收机制,所以有必要把这两个概念搞清楚。1、消息确认机制
  主要是生产者使用的机制,用来确认消息是否被成功消费。
  配置如下:
  这样,当你实现RabbitTemplate。ConfirmCallback,RabbitTemplate。ReturnCallback这两个接口的方法后,就可以针对性地进行消息确认的日志记录,之后做进一步的消息发送补偿,以达到接近100投递的目的。
  伪代码如下:
  2、消息签收机制RabbitMQ的消息是自动签收的,你可以理解为快递签收了,那么这个快递的状态就从发送变为已签收,唯一的区别是快递公司会对物流轨迹有记录,而MQ签收后就从队列中删除了。
  企业级开发中,RabbitMQ我们基本都开启手动签收方式,这样可以有效避免消息的丢失。
  前文中已经在生产者开启了手动签收机制,那么作为消费方,也要设置手动签收。
  配置如下:
  消费监听时,手动签收就一行代码,伪代码如下:
  三、消息丢失
  两个概念搞清楚后,就可以来学习消息丢失的问题和处理方案了。1、出现原因消息丢失的原因无非有三种:
  1)、消息发出后,中途网络故障,服务器没收到;
  2)、消息发出后,服务器收到了,还没持久化,服务器宕机;
  3)、消息发出后,服务器收到了,消费方还未处理业务逻辑,服务却挂掉了,而消息也自动签收,等于啥也没干。
  这三种情况,(1)和(2)是由于生产方未开启消息确认机制导致,(3)是由于消费方未开启手动签收机制导致。2、解决方案1)、生产方发送消息时,要try。。。catch,在catch中捕获异常,并将MQ发送的关键内容记录到日志表中,日志表中要有消息发送状态,若发送失败,由定时任务定期扫描重发并更新状态;
  2)、生产方publisher必须要加入确认回调机制,确认成功发送并签收的消息,如果进入失败回调方法,就修改数据库消息的状态,等待定时任务重发;
  3)、消费方要开启手动签收ACK机制,消费成功才将消息移除,失败或因异常情况而尚未处理,就重新入队。
  其实这就是前面阐述两个概念时已经讲过的内容,也是接近100消息投递的企业级方案之一,主要目的就是为了解决消息丢失的问题。
  四、消息重复1、出现原因消息重复大体上有两种情况会出现:
  1)、消息消费成功,事务已提交,签收时结果服务器宕机或网络原因导致签收失败,消息状态会由unack转变为ready,重新发送给其他消费方;
  2)、消息消费失败,由于retry重试机制,重新入队又将消息发送出去。2、解决方案网上大体上能搜罗到的方法有三种:
  1)、消费方业务接口做好幂等;
  2)、消息日志表保存MQ发送时的唯一消息ID,消费方可以根据这个唯一ID进行判断避免消息重复;
  3)、消费方的Message对象有个getRedelivered()方法返回Boolean,为TRUE就表示重复发送过来的。
  我这里只推荐第一种,业务方法幂等这是最直接有效的方式,(2)还要和数据库产生交互,(3)有可能导致第一次消费失败但第二次消费成功的情况被砍掉。
  五、消息积压1、出现原因消息积压出现的场景一般有两种:
  1)、消费方的服务挂掉,导致一直无法消费消息;
  2)、消费方的服务节点太少,导致消费能力不足,从而出现积压,这种情况极可能就是生产方的流量过大导致。2、解决方案1)、既然消费能力不足,那就扩展更多消费节点,提升消费能力;
  2)、建立专门的队列消费服务,将消息批量取出并持久化,之后再慢慢消费。
  (1)就是最直接的方式,也是消息积压最常用的解决方案,但有些企业考虑到服务器成本压力,会选择第(2)种方案进行迂回,先通过一个独立服务把要消费的消息存起来,比如存到数据库,之后再慢慢处理这些消息即可。
  六、使用心得这里单独讲一下本人在工作中使用RabbitMQ的一些心得,希望能有所帮助。
  1)、消息丢失、消息重复、消息积压三个问题中,实际上主要解决的还是消息丢失,因为大部分公司遇不到消息积压的场景,而稍微有水准的公司核心业务都会解决幂等问题,所以几乎不存在消息重复的可能;
  2)、消息丢失的最常见企业级方案之一就是定时任务补偿,因为不论是SOA还是微服务的架构,必然会有分布式任务调度的存在,自然也就成为MQ最直接的补偿方式,如果MQ一定要实现100投递,这种是最普遍的方案。但我实际上不推荐中小企业使用该方案,因为凭空增加维护成本,而且没有一定规模的项目完全没必要,大家都小看了RabbitMQ本身的性能,比如我们公司,支撑一个三甲医院,也就是三台8核16G服务器的集群,上线至今3年毫无压力;
  3)、不要迷信网上和培训机构讲解的生产者消息确认机制,也就是前面两个概念中讲到的ConfirmCallback和ReturnCallback,这种机制十分降低MQ性能,我们团队曾遇到过一次流量高峰期带来的MQ传输及消费性能大幅降低的情况,后来发现是消息确认机制导致,关闭后立马恢复正常,从此以后都不再使用这种机制,MQ运行十分顺畅。同时我们会建立后台管理实现人工补偿,通过识别业务状态判断消费方是否处理了业务逻辑,毕竟这种情况都是少数,性能和运维成本,在这一块我们选择了性能;
  4)、我工作这些年使用RabbitMQ没见过自动签收方式,一定是开启手动签收;
  5)、手动签收方式你在网上看到的教程几乎都是处理完业务逻辑之后再手动签收,但实际上这种用法是不科学的,在分布式的架构中,MQ用来解耦和转发是非常常见的,如果是支付业务,往往在回调通知中通过MQ转发到其他服务,其他服务如果业务处理不成功,那么手动签收也不执行,这个消息又会入队发给其他消费者,这样就可能在流量洪峰阶段因为偶然的业务处理失败造成堵塞,甚至标题所讲的三种问题同时出现,这样就会得不偿失。
  不科学的用法:在处理完业务逻辑后再手动签收,否则不签收,就好比客人进店了你得买东西,否则不让走。
  科学的用法:不论业务逻辑是否处理成功,最终都要将消息手动签收,MQ的使命不是保证客人进店了必须消费,不消费就不让走,而是客人能进来就行,哪怕是随便看看也算任务完成。
  可能有人会问你这样不是和自动签收没区别吗,NO,你要知道如果自动签收,出现消息丢失你连记录日志的可能都没有。
  另外,为什么一定要这么做,因为MQ是中间件,本身就是辅助工具,就是一个滴滴司机,保证给你送到顺便说个再见就行,没必要还下车给你搬东西。
  如果强加给MQ过多压力,只会造成本身业务的畸形。我们使用MQ的目的就是解耦和转发,不再做多余的事情,保证MQ本身是流畅的、职责单一的即可。
  七、总结本篇主要讲了RabbitMQ的三种常见问题及解决方案,同时分享了一些作者本人工作中使用的心得,我想网上是很难找到的,如果哪一天用到了,不妨再打开看看,也许能避免一些生产环境可能出现的问题。
  我总结下来就是三点:
  1)、消息100投递会增加运维成本,中小企业视情况使用,非必要不使用;
  2)、消息确认机制影响性能,非必要不使用;
  3)、消费者先保证消息能签收,业务处理失败可以人工补偿。
  工作中怕的永远不是一个技术不会使用,而是遇到问题不知道有什么解决思路。
  END
  私信作者回复资源有更多惊喜内容哦!
投诉 评论 转载

万物皆可外卖2022即时零售重燃战火阿里严阵以待,京东美团必每经记者:陈婷王郁彪每经编辑:董兴生迈入2022年,在巨头林立的电商行业,即时零售的存在感变得越来越强。这段时间,自我定位为不止送餐的饿了么频繁登上热搜;在刚过去不……RabbitMQ消息丢失消息积压原因解决方案私人心得一、前言首先说一点,企业中最常用的实际上既不是RocketMQ,也不是Kafka,而是RabbitMQ。RocketMQ很强大,但主要是阿里推广自己的云产品而开源出来的一……这5个不起眼的坏习惯,也许正在掏空你的肾!看看你中了几条大家好,我是李医生!生活中有5个不起眼的坏习惯,正在掏空你的肾,那什么样的习惯最容易伤肾呢?下面我来告诉你。首先第一个就是喝水喝得少了,我们肾呢,就好比是身体一个污……法国时尚博主AliceMoireau把兴趣做成工作古典气质令今天T爷给大家介绍来自法国时尚博主AliceMoireau,她的分享很有胶片感和故事感,就像是把普罗旺斯的夏天展示在你面前。简单的白色吊带裙像绿色的田园一般简单舒适。……入伏前,建议少吃猪肉,多吃5种美食,充满活力,轻松度过三伏天随着气温的逐渐升高,一年中最热的三伏天即将到来,它在小暑和处暑之间,是全年最热的、最潮湿的日子,随着三伏天的临近,意味着炎热的夏天将要来了,要注意身体降温,注意避暑。持续……小白新房装修空调怎么选华凌空调一键选购省钱又省心新生代的年轻人也面临装修自己的第一套房子,相比老一辈人,他们的消费更加理性,量力而为不攀比,只买对的不买贵的,不过分追求性价比而导致价低质次,而转向更加科学、精致的质价比。空调……舞王郭富城29年前一个摇头霸屏全网,却对天王嫂抠抠搜搜?50多岁的郭富城怎么也不会想到,自己1993年的一个动作,竟然会在20多年后再度风靡网络,迷倒一大片少男少女。然而就是这样摄人心魄的郭天王,却在同年遭到了林志颖的嘲讽。……那个与杨幂邓超合作过的15岁童星女孩,被逼跳楼了01hr如果不是2021年11月7日,女儿决绝地纵身一跃。尤永梅可能不会知道,那个外人眼中活泼可爱、明艳聪慧的15岁姑娘,内心早已经破碎。一周前,尤永梅在网络上发布……蔡少芬一家喝下午茶,素颜太过真实,张晋陪儿子玩耍父爱爆棚前段时间上海解封不久,蔡少芬张晋夫妇搬离了上海租的豪宅,回到了土生土长的香港,引起了不少网友的热议,而且还上了热搜。没想到的是,最近蔡少芬一家又回到了内地旅游,跟家人一起在咖啡……重温还珠终于懂了为何小燕子给女儿取名南儿,紫薇不配将来有一天小燕子如果犯错了,请饶她不死。电视剧《还珠格格》中,几人出宫游玩时,皇上和紫薇被挤到了一个角落里。紫薇救父心切,被杀手捅了一刀,太医拔刀抢救时生死未卜。……315曝光康师傅老坛酸菜牛肉面酸爽,双汇火腿肠真香,竟是这样在你的眼里和胃里,正宗的老坛酸菜是怎样的呢?是下面这样用老坛腌制的吗?然后洗洗切切成下面这样的酸爽感觉吗?其实都不是,下面请屏住呼吸,不要吐!315晚会告诉你,康师……有望接近2亿美元续约!热火希罗爱情事业双丰收NBA常规赛,热火队主场迎战活塞队,比赛直到最后2分钟才分出胜负,最终热火10598险胜活塞,避免连败。本场比赛热火队高富帅泰勒希罗15投8中(三分8中4),拿下29分5篮板4……
中国蚕业科学研究世界领先超级蚕育种计划启动一吃辣就便血是怎么回事?这种情况该怎么办?带2岁儿子进女厕所,被骂没素质国外媒体为何如此关注朱雀二号发射失利?殊不知中国差点创造历史U18女篮亚锦赛中国胜韩国获U19世界杯参赛资格重庆芦苇花海来了,公交直达不要门票,距离主城区1小时车程摊牌了?潘石屹放弃掩饰出逃计划,人民日报说对了黑马突围,为什么是安徽和陕西?人类和大猩猩有生殖隔离,科学界,又是怎么发现的?华西证券给予长安汽车买入评级好!好!美记高价值首轮签还在不断升值,湖人有望拿下488悍将数字人民币试点城市再扩围广东江苏河北四川全省用户可在京东领3
如果杜峰还有点骨气,是时候请辞了房产申请行政复议规定是什么?女排东京惨败郎平应该负有最大责任,主教练不负责任那谁负责任?平安夜发朋友圈的短句(平安夜发朋友圈短句)天天酷跑皇家狮鹫搭配阿努比斯厉不厉害鲜人参晒制干人参的重量比例是什么如何在最短的时间内赚到100万?人生贵在磨练作文丘比特是什么意思丘比特的意思一次购物小票的发现如何应对表现欠佳的工作评价聋人只能佩戴助听器吗?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州