范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

面试官杠上重复消费消息堆积消息丢失顺序消息?

  消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360 的刁难。
  面试官杠上消息队列?重复消费、消息堆积、消息丢失、顺序消息...
  什么,这么多问题啊!别慌,现在就来找找解决方案。
  一、 重复消费
  现在消息队列一般都能保证at least once的,也就是消息至少一次投递。 在这种情况为什么会出现重复消费的问题呢?通常都是由于网络原因造成的 ,原因如下:通常消息被成功消费后消费者都会发送一个成功标志给MQ,MQ收到这个标志就表示消息已经成功消费了,就不会再发送给其他消费者了。但是如果因为网络这个标志没有送到MQ就丢失了,MQ就认为这个消息没有被成功消费,就会再次发送给其他消费者消费,就造成重复了。
  这时我们看这个问题就变成了我们怎么保证消费端的幂等性。
  幂等性  是指一个操作其执行任意多次所产生的影响均与一次执行的影响相同,大白话就是你同样的参数调用我这个接口,调用多少次结果都相同。
  怎么保证消息队列消费的幂等性
  其实还是得结合业务来思考,我在这里给出几个解决方案:
  1. 分布式锁。生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个 id 去比如 Redis 里查一下,之前消费过吗?如果没有消费过,你就处理,然后就是这个 id 写 Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。
  2.唯一键防重。基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。
  3.先查后写。要写数据库前,先根据主键查一下,如果这数据都有了,你就别插入了,update一下好了。
  4. 关闭重试机制。如果把重试机制关掉的话不显示,虽然解决了重复消费的问题,但是可能会造成丢失消息,不建议这么做。
  不同的业务可以选择不同的方案,如果服务的并发量不高,可以考虑唯一键防重或者先查后写的方案;如果并发量较高,追求性能,沐子推荐采用分布式锁实现幂等性(本公司目前采用的方案)
  二、 消息堆积
  1. 消息堆积的产生原因
  消息堆积的原因主要在于两方面,其一为消费的太慢或消费方出现异常,其二为生产方生产的太快,总的来说就是消息的速度赶不上生产的速度,生产和消费速度不匹配造成的 。
  2. 消息堆积的解决方案
  1)生产端:一般当生产端发生积压(Broker正常的情况下)就要查看你的业务逻辑是否有异常的耗时步骤导致的,是否需要改并行化操作等。
  Broker端:当Broker端发生积压我们首先要查看,消息队列内存使用情况,如果有分区的的话还得看每个分区积压的消息数量差异。当每个分区的消息积压数据量相对均匀的话,我们大致可以认为是流量激增。需要在消费端做优化,或者同时需要增加Broker节点(相当于存储扩容),如果分区加压消息数量差异很大的话(有的队列满了,有的队列可能还是空闲状态),我们这时候就要检查我们的路由转发规则是否合理。
  2) 增加消费者 ,多部署几台消费者机器(横向扩展),提升消费者的消费能力。
  3)此种情况可以将这些消费不成功的消息转发到其它队列里去(类似死信队列) ,后面再慢慢分析死信队列里的消息处理问题。
  4) mq 中的消息过期失效了。可以采取一个方案,就是批量重导 ,这个我们之前线上也有类似的场景干过。就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回来。
  总之,上面说到消息积压的问题,我们需要查看是否有无限重发的消息或者有进入死锁的程序等等,当确定是流量激增的话,我们需要评估是否需要增加资源还是通过限流的方式解决,当短时间大量消息需要处理时,在资源允许的情况下,我们可以新启一批消费者与消息队列,将原来的消费者中的消息直接作为生产者转发到临时应急队列中,这样大概率的能够快速解决消息积压。与其事后处理不如我们在设计之初就要把积压考虑进来,对于数据量非常大,但是实时性要求不高的场景,可以设计出批量消息发送,当队列积累到一定阀值再做批量消费消费,这里需要注意的就是重复消费带来的影响,设计不好就是一场灾难。
  三、 消息丢失
  一般来讲消息丢失的途径有三个: 生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据 。
  1. 生产者弄丢数据
  a、丢失的原因:因为网络传输的不稳定性,当生产者在向MQ发送消息的过程中,MQ没有成功接收到消息,但是生产者却以为MQ成功接收到了消息,不会再次重复发送该消息,从而导致消息的丢失。
  b、解决办法:有两个解决办法,第一个方法: 向broker发送消息时,如果由于网络抖动等原因导致消息发送失败,可以设置失败重试次数让消息重发 。
  第二个方法: 事务机制和confirm机制,最常用的是confirm机制 ;
  事务机制和 confirm 机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是 confirm 机制是异步的,你发送个消息之后就可以发送下一个消息,然后那个消息 MQ 接收了之后会异步回调你的一个接口通知你这个消息接收到了。
  2. MQ弄丢数据
  a、丢失的原因:MQ接收到生产者发送过来的消息,是存在内存中的,如果没有被消费完,此时MQ宕机了,那么再次启动的时候,原来内存中的那些消息都丢失了。
  b、解决办法: 开启MQ的持久化 。结合上面的说到的confirm机制,只有当消息成功持久化磁盘之后,才会回调生产者的接口返回ack消息,否则都算失败,生产者会重新发送。存入磁盘的消息不会丢失,就算MQ挂掉了,重启之后,他会读取磁盘中的消息,不会导致消息的丢失。
  注意,哪怕是你给 MQ 开启了持久化机制,也有一种可能,就是这个消息写到了MQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时MQ挂了,就会导致内存里的一点点数据丢失。
  所以,持久化可以跟生产者那边的 confirm 机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者 ack 了,所以哪怕是在持久化到磁盘之前,MQ 挂了,数据丢了,生产者收不到 ack,你也是可以自己重发的。
  3. 消费者弄丢数据
  a、丢失的原因:如果MQ成功的把消息发送给了消费者,那么MQ的ack机制会自动的返回成功,表明发送消息成功,下次就不会发送这个消息。但如果就在此时,消费者还没处理完该消息,然后宕机了,那么这个消息就丢失了。
  b、解决的办法:1)简单来说,就是必须关闭 MQ 的自动提交,把自动提交改为手动提交 ,也就是说当我消费成功后才会进行提交。
  2)消费者端已经正常接收到消息但是在执行后续消息处理时发生了异常,最终返回处理失败。重试-进行重新消费问题,如果一直这样重复消费都持续失败到一定次数,可以投递到 DLQ 死信队列,应用可以监控死信队列来做人工干预 。
  四、 顺序消费
  比如一个电商的下单操作,下单后先减库存然后生成订单,这个操作就需要顺序执行的。队列本身是有顺序的,但是为什么还要保证顺序消费呢,主要是因为生产环境服务实例一般都是集群,当消费者是多个实例时,队列中的消息会分发到所有实例进行消费(同一个消息只能发给一个消费者实例),这样就不能保证消息顺序的消费,因为你不能确保哪台机器执行消费端业务代码的速度快。
  保证每次只有单个消费实例消费
  所以对于需要保证顺序消费的业务,我们可以只部署一个消费者实例,然后设置MQ 每次只推送一个消息,再开启手动 ack 即可。这样MQ 每次只会从队列推送一个消息过来,处理完成之后我们 ack 回应,再消费下一个,就能确保消息顺序性。
  这样MQ 每次只会从队列推送一个消息过来,处理完成之后我们 ack 回应,再消费下一个,就能确保消息顺序性。
  但是这样的操作也会降低消费者的性能, 一个消费者消费消息时,其他消费者会阻塞,所以很多场景下可能并不会采用这样的方案。
  所以一般会根据场景,制定一定的策略来解决消费顺序问题。
  多线程并发抢占出现消费乱序问题
  当MQ采用简单队列模式的时候,如果消费者采用多线程的方式来加速消息的处理,此时也会出现消息乱序的问题。
  多线程并发抢占出现消费乱序问题,将消息ID进行hash计算,将相同值放入同一个内存队列,让指定线程执行,即可解决顺序消费问题。
  在多个分区中保证消息顺序和消息处理效率
  首先使用多个分区,消息可以被发送端发送至多个分区,保证消息发送的效率。然后在消费端在拉消息时使用ConutdownLunch来记录一组有序消息的个数。如果达到个数,说明已拉取到完整的一组有序消息。然后在消费端根据消息序号进行排序,消费端将排好序的消息发到内存队列(可以搞多个),一个内存队列开启一个线程顺序处理消息。即可最大程度上既保证顺序又保证效率!
  RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件,支持顺序消息,所以如果有这种场景或者要使用MQ,小编建议你直接使用RocketMQ即可。
  我们说了一些处理与分析问题的方法,这里有一个最重要的点就是我们需要有一套实用的监控发现工具或者方式,在问题第一时间发现才是王道,不然我们上面所说的都空谈,当问题发现的时候损失已经无法挽回。所以我们要在设计系统之初需要要为监控系统或者程序提供完备或者必须的日志,接口,数据等,这要才是一个合理的设计。当没有监控系统的情况下我们必须自己设计一套简单分析接口。
  最后,如果我的文章对你有所帮助或者有所启发, 欢迎关注公众号(微信搜索公众号:首席架构师专栏),里面有许多技术干货,也有我对技术的思考和感悟,还有作为架构师的验验分享;关注后回复 【面试题】,有我准备的面试题、架构师大型项目实战视频等福利 , 小编会带着你一起学习、成长,让我们一起加油!!!

拼多多年货节30亿红包加码农产品上行为春节就地过年保供稳价春节临近,不少人选择留在工作居住地度过节日,米袋子菜篮子等民生保障用品也即将迎来消费高峰。1月27日,拼多多此前推出的年货节活动,也迎来一波置办年货的热潮,尤其是蔬果粮油肉禽蛋奶等摄影师好帮手ELECJETP20充电宝作为一个摄影师,出去干活的时候包里面要背的东西有相机电脑监视器稳定器灯具。还有日常用的手机。如果是整天的那种对于充电这个事情,有插座的时候就会接上电源进行充电,可是更多的时候是没有大头君有点困组建一套娱乐和轻办公的桌面我都用到了什么东西前段时间家里面正好有一张桌子空出来,想着放着也是放着,于是就将之前的一些东西还有新入手的一些东西都拿出来,组装成一套轻办公和娱乐用的桌面,至于为什么是轻办公和娱乐用的桌面,因为已经大头君有点困跑步运动的过程中我选择的是什么耳机?之前有文章分享过因为想要动过跑步的过程瘦下来,入手了咕咚X3RE这块智能手表,可以让自己跑步的时候不用携带手机就进行跑步的同时记录运动过程中的数据,但是跑步过程我习惯听音乐,这样跑立白拼多多携手开启超级品牌日小小除菌洗衣凝珠日销3万盒洗洗刷刷过大年。又到一年清洗季,作为拼多多年货节重点合作的洗涤品牌之一,立白于1月18日推出以除菌守护安心过年为主题为期两天的超级品牌日活动,吸引了数十万网友抢购囤货。立白超品日期国产固态硬盘读写3400MBs3100MBs是什么水平?龟甲T3000测试不论是无线还是有线,我们对数据传输速度的需求似乎没有尽头。4G过后是5G,SATA通道又被PCIe弯道超车。历史上,因为IDE接口的速度满足不了我们对于数据传输的要求,于是在200索尼2021款OLED旗舰,A90J的体验如何?打造玩家居心地索尼4K120Hz刷新率的OLED新旗舰A90J的体验如何?破晓刚结束硬装,处在添置家电的阶段。最初的设想是有一个能放松自己也可以让朋友周末开开黑打打游戏的空间。预想三星144Hz电竞屏六指战神腾讯ROG游戏手机5开售3月10日,新姿势实力派腾讯ROG游戏手机5系列新品正式亮相。新品分为三个机型,包括拥有黑白两种配色的腾讯ROG游戏手机5黑色配色腾讯ROG游戏手机5Pro,以及白色配色的旗舰版腾一站式解决消费级M。2固态硬盘导购(附同平台测试)2021版看过了很多评测,还是不知道固态硬盘怎么买?测试平台不同,测试结果鸡同鸭讲无法对比?款式太多,总是下不了决心?这次破晓把主流的M。2固态都放到一起测试,给你一个最直观的结果,结尾会有矿视界之科普入门一文读懂比特现金(BCH)的诞生从13年下半年开始,比特币网络出现了拥堵的情况,为数不少的用户反映自己的交易被延后了许久才得以执行。经观察发现,这是因为当时比特币的区块容量已经无法及时处理网络相关信息所导致的。究矿视界译文比特币在萨尔瓦多成为法定货币意味着什么?当地时间6月9日晚上8点,经过数小时的激烈辩论,萨尔瓦多立法会议最终以62票赞成通过了总统纳伊布布克勒提出的法案,承认比特币作为其国家的法定货币。随后总统通过他的推特账户宣布,比特
英雄传说闪之轨迹44月10日发售,完结篇登场根据此前发行商NISAmerica和开发商Falcom官宣的消息,英雄传说闪之轨迹4Steam版已确定将与欧美地区NS版同步,于4月10日正式上线发售。闪之轨迹4是闪之轨迹系列的完这款年度最佳双人游戏,让我学会了情商众所周知,胖头鱼YYF手下四大著作情商一直是被各路水友天天挂在嘴边的名著。然而这门无比高深的情商课,却被一款游戏在一夜之间实现了全民普及。多少和小A一样陪对象玩游戏的玩家,通过这款电量消耗太快?一招解决有些人聊着聊着就不见了,有些文件传着传着就断了,有些电脑用着用着就没电了如果能找出那些耗电的应用或进程,结束它更新它,或者卸载它,不就能延长电池的续航时间啦找出耗电的应用同时按CT11代酷睿好机友华硕B560重炮手开启生化危机8日本游戏厂商卡普空(Capcom)于近期举行了生化危机8的直播展示活动,这是一款多人联机的生存恐怖游戏,将于5月7日正式发售,且支持中文语音及简繁中文字幕。本作故事发生在东欧地区,玩转反差萌的ROG幻13身材小是真,实力强也不假谁说老爷爷就不能与卡通人合影,谁说大学教授就不能看猫和老鼠,谁说纹身男就不能是居家暖男,谁说壮汉就不能养小猫咪这不就是所谓的反差萌吗!一如我们的ROG幻13,尽管表面看起来小巧玲珑教你一招,快速分辨固态电容我们常常听说主板上会使用固态电容。那么,什么是固态电容?如何分辨呢?固态电容和液态电容(即电解电容)都属于极性电容。目前大部分台式机主板采用的极性电容都是固态电容。它们最大的区别在2022款广汽传祺GS8将上市,第四代丰田THS混动系统技术解析!2022款广汽传祺GS8已经开启预售,预售价格在18。8824。68万之间,分为普通的燃油版车型以及混动版车型,混动车型受到了很多的关注,主要是搭配了丰田第4代THS混合动力系统。你必须知道的5条电脑常识打工人不容易,生活压力那么大,而我只想安静打游戏上网看片。可是老爸老妈老板老婆老公总是突然出现你懂得!知识改变命运!总有一些技巧,帮你打开新世界的大门情景1我正在如痴如醉地遨游于自WIN10自带,0基础也能轻松恢复系统当我们遇到电脑问题时完犊子了,重装系统吧什么???这就重装系统了?那不然618重买一个?好家伙败家恢复系统试过了吗?很多问题恢复系统都能解决!哇塞,可惜我不会哎那我教你好啦什么是系连续三日涨停背后,天下秀究竟交出了一份怎样财报?高瓴资本张磊曾在其所著的价值一书中提到,企业顺着产业大势发展,如顺水行舟。当下,红人经济崛起就是确定的产业大势。根据中指研究院数据,2020年红人经济市场规模超过1。4万亿,并预计小镇智慧旅游项目技术方案这是某度假小镇智慧旅游项目技术方案,可借鉴参考。方案目录1需求分析2规划目标3建设目标4建设原则5总体建设框架6。。领取方式见文末温馨提示该份资料共82页,我们已经为您整理成电子文