游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

RabbitMQ如何实现数据100不丢失

  文中代码主要以golang为示例,其他语言实现方式请自行Google
  RabbitMQ一条消息从生产端到消费端共经3个步骤:生产端发送消息到RabbitMQ;RabbitMQ发送消息到消费端;消费端消费这条消息。
  如图所示,在每个步骤中都可能会发生消息丢失的情况,因而我们需要有措施来保障系统的可靠性。(磁盘损坏等极端情况就不在我们的考虑范围啦)一、生产端投递消息可靠性
  生产端投递消息丢失的原因有很多,例如消息在传输过程中发生网络故障导致丢失,或者消息投递到RabbitMQ时RabbitMQ挂了,从而引发消息丢失,此类情况我们根本无法预估并知晓。
  因而,我们可以利用RabbitMQ的一些机制来处理1。事务消息机制
  事务处理方案所说能够保障消息的强一致性,但因此造成的性能损耗较大,面对大量消息推送时性能问题严重,故而我们可以考虑轻量级解决方案:confirm消息确认机制2。confirm消息确认机制
  生产端投递的消息投递到RabbitMQ后,RabbitMQ将发送一个确认消息给到生产端,让生产端知晓我已收到消息,否则这条消息就可能丢失了,需要生产端再次发起消息投递。
  开启确认机制:errchannel。Confirm(false)
  以confirm模式发送消息示例:packagemainimport(fmtgithub。comstreadwayamqprmqdbrmq)var(channelamqp。Channelerrerrorqueueamqp。Queueconnamqp。Connection)funcmain(){conn,errrmq。GetConn()deferconn。Close()channel,errconn。Channel()iferr!nil{fmt。Printf(error:s,err。Error())return}deferchannel。Close()errchannel。Confirm(false)iferr!nil{fmt。Printf(error:s,err。Error())return}queue,errchannel。QueueDeclare(confirm:message,false,false,false,false,nil)iferr!nil{fmt。Printf(error:s,err。Error())return}confirms:channel。NotifyPublish(make(chanamqp。Confirmation,1))deferconfirmOne(confirms)errchannel。Publish(,queue。Name,false,false,amqp。Publishing{ContentType:textplain,Body:〔〕byte(confirmmessage),})iferr!nil{fmt。Printf(error:s,err。Error())return}fmt。Println(消息发送成功)}funcconfirmOne(confirmschanamqp。Confirmation){ifconfirmed:confirms;confirmed。Ack{fmt。Printf(带标志的消息投递确认:d,confirmed。DeliveryTag)}else{fmt。Printf(消息投递确认:d,confirmed。DeliveryTag)}}
  采用此种方案就可以让生产端感知到消息是否投递到RabbitMQ中。二、消息持久化
  RabbitMQ收到消息后是暂存到内存当中,此时若RabbitMQ挂了,重启服务将会导致数据丢失,所以我们应当将相关数据持久化到硬盘中,这样RabbitMQ重启后依然可以到硬盘中取数据恢复。
  消息达到RabbitMQ后先到exchange交换机,然后路由到queue队列,最后发送给消费端。
  因而需要对exchange、queue、message都进行持久化:
  exchange持久化:第三个参数true表示这个exchange持久化channel。ExchangeDeclare(exchange,direct,true,false,false,true,nil)
  queue持久化:第二个参数true标识这个queue持久化channel。QueueDeclare(confirm:message,true,false,false,false,nil)
  message持久化:errch。Publish(exchange,queuename,false,false,amqp。Publishing{DeliveryMode:amqp。Persistent,消息持久化ContentType:textplain,Body:〔〕byte(msgBody),})
  注意:如果需要消息持久化,Queue也是需要设定为持久化才有效。
  这样,如果RabbitMQ收到消息后挂掉了,重启后会自行恢复消息。
  思考一下,基于以上几种机制,我们还是不能完全保证消息可靠性投递到RabbitMQ中,比如极端情况,RabbitMQ收到消息还没来得及将消息持久化到硬盘时,RabbitMQ挂掉了,此时消息依然是丢失了;或者RabbitMQ在发送确认消息给生产端的过程中,由于网络故障导致生产端没有收到确认消息,导致生产端不知道RabbitMQ是否收到消息,依然不好处理接下来的业务。
  因而我们需要在上述机制的基础上,考虑一些消息补偿机制,以应对部分极端情况,比如消息入库。三、消息入库
  我们可以考虑将要发送的消息保存到数据库中,标注一个状态字段status0,标识生产端将消息发送给RabbitMQ但还没收到确认回复。在生产端收到RabbitMQ确认回复后,将status设为1,表示RabbitMQ已收到消息。
  考虑到前面提到的极端情况,我们可以在生产端开设一个定时器,定时检索消息表,将status0并且超过固定期限后还没收到确认的消息内容取出重发(此时消费端要考虑消息重复情况,提前做好幂等性设置),并设定重发最大次数,超限做单独的特殊处理。
  到此,消息就可以可靠性投递到RabbitMQ中,生产端也可以正常感知了。四、消费端信息不丢失
  正常情况下,以下三种情况会导致消息丢失在RabbitMQ将消息发出后,消费端还没有接收到消息前发生网络故障,消费端与RabbitMQ断开连接,此时消息会丢失;在RabbitMQ将消息发出后,消费端还没有接收到消息前消费端挂了,此时消息会丢失;消费端准备接收到消息后,但在处理消息过程中发生异常或宕机,消息会丢失。
  综合上述三种情况,都是因为RabbitMQ的自动ack机制,即RabbitMQ默认在消息发出后就立即将这条消息删除,而不管消费端是否接收到,是否处理完,导致消费端消息丢失时,RabbitMQ也没有该消息了。
  因此就需要将自动ack机制改为手动ack机制。
  消费端手动确认消息:接收消息messages,err:r。channel。Consume(r。QueueName,队列名称,区分消费者false,设置关闭自动应答,每条消息必须手动ackfalse,false,false,nil)iferr!nil{fmt。Println(err)}消费消息channel:make(chanbool)gofunc(){fork:rangemessages{true表示确认所有未确认消息false表示确认当前消息k。Ack(false)}}()阻塞主程序channel
  当autoAck设置为false时,对于RabbitMQ服务端而言,队列中的消息就分为两类:等待投递给消费端的消息已经投递给消费端,等待消费端发回确认信号的消息
  如果RabbitMQ一直没有接收到消费端的确认信号,且消费端已经断开链接或宕机,此时RabbitMQ会将此消息重新放入队列,等待下次投递。故而消费端也需要做好幂等性设置,确保消息重复处理机制。
  综合以上方案,即可保证生产端RabbitMQ消费端全链路数据不丢失啦!

网友猜RedmiK30Pro售价2999元,小米卢伟冰又来捣IT之家2月25日消息今日小米中国区总裁、Redmi品牌总经理卢伟冰在微博上官宣:RedmiK30Pro将全系搭载骁龙865芯片。并且表示,全新RedmiK30Pro将于3月与……卢伟冰小米10首周在4000价格段市场占有率超10IT之家2月25日消息IT之家获悉,今日上午,小米集团副总裁、中国区总裁、红米Redmi品牌总经理卢伟冰表示,小米在中国手机市场的份额在稳步上升。卢伟冰指出,小米10有效……华为相信加拿大司法系统将还孟晚舟清白IT之家1月21日消息曾轰动一时的华为孟晚舟案于当地时间1月20日上午10点在温哥华开庭。同时华为方面也在推特上发布关于孟晚舟案听证会的声明。华为方面表示:我们信任加拿大……华为手机新设计专利曝光后置X五摄IT之家1月21日消息据91mobiles报道,近日华为手机的新专利曝光,采用后置X型五摄设计。据91mobiles报道,近日华为公司向德国专利局DPMA申请了一项新的设……植物大战僵尸花园战争2新手前期玩法心得今日小编给我们带来的是一位玩家共享的《植物大战僵尸:花园战争2》新手前期玩法心得,不知道新手怎样玩的玩家,快跟小编一起来看看吧。作者我也是从一代玩起,触摸时刻不长或许就几……小米Poco新机月底发布采用120HzAMOLED显示屏IT之家8月21日消息小米将在月底面向全球市场推出新款Poco手机,亮点是采用120Hz刷新率的AMOLED显示屏。Poco全球发言人AngusKaiHoNg在其Twit……微信偷偷测试新功能,你看过的文章终于有记录了目前,iOS微信已经推出8。0。29正式版半个月了,而安卓还停留在8。0。28正式版中,不过大家不要着急,按照微信以往的惯例离更新新版本也不远了。在没有更新的时间里,最近芝麻妹……微信隐藏功能可以查换头像次数了想知道你更换过多少次头像,在微信里就可以查到。自从微信更新到8。0。19版本后,对隐私权限做了升级。用户可以查看微信内各项功能的具体隐私权限,就连你更换过多少次头像,都可……微信安卓8。0。9测试版更新支持多客户端登录,个性提示音上线感谢IT之家网友软媒用户1106553的线索投递!IT之家7月20日消息感谢IT之家网友热心线索投递,继微信iOS版后我们现又迎来了8。0。9正式版更新,更新频率可谓非常……华为海思狂招人才,旨在芯片研发三分钟带你看尽每周数码科技知识热点近日,据外国媒体报道,华为公司正在招大量的博士,旨在加快半导体芯片研究的速度。华为品牌这一举动,引发了国内不少网友的热议。根据相关……一味治疗脾胃虚弱的中药黄精今日给大家介绍一味治疗脾胃虚弱、体倦乏力、口干食少、肺虚燥咳的中药黄精。黄精【别名】垂珠、龙衔、太阳草、野仙姜、山生姜、鸡头参、黄鸡菜、笔菜、黄芝、土灵芝。【产地分……蓄势待展三星发邀请函,8月11日发布新款折叠屏手机ZFold北京时间7月21日消息,三星电子今天正式宣布,公司将于美国东部时间8月11日10点(北京时间8月11日22点)举行下一场Unpacked产品线上发布会。业内普遍预计,三星……
还能升级安卓11,摩托罗拉Razr折叠屏推送安卓10更新手势感谢IT之家网友肖战割割的线索投递!IT之家5月15日消息摩托罗拉Razr与三星GalaxyZFlip的主要区别在于外屏尺寸,随着Android10的更新,摩托罗拉正在极……三星手机遇大面积系统崩溃现黑屏重启等情况(附解决方法)感谢IT之家网友大明蜀黍的线索投递!IT之家5月23日消息据IT之家网友反馈,5月23日凌晨大量三星手机用户微博发文称自己的三星设备遭遇黑屏和大面积重启问题。此次受影响手……小米PocoM2Pro印度发布,搭载骁龙720G,约1300IT之家7月7日消息小米PocoM2Pro现已在印度发布,配置了高通骁龙720G处理器,搭载了5000毫安的电池,并且配备了33W的快速充电器。IT之家了解到,小米Poc……新机将至!微软SurfaceDuo即将通过Android兼容IT之家7月10日消息据Windowslatest报道,微软SurfaceDuo已准备通过Android兼容性测试并预装Android10,这表明该设备即将正式与消费者见面。……Android11将允许用户设置特定的WiFi不自动连接IT之家7月9日消息据外媒Androidpolice报道,Android11在WiFi网络的设置面板中新增了一个名为自动连接的按钮,当用户选择关闭时,设备就不会自动连接到当前环……砍掉充电器和耳机?苹果敢,Android厂商可能真不敢手机不送充电器你能接受吗?苹果iPhone12用户可能将会很快接受这个事实,Android厂商其实也曾有过这样的打算,不过短期之内可能还无法像苹果般那样任性,真要这么做风险有点……曝安卓11正式版9月8日发布,谷歌否认感谢IT之家网友戦場原荡漾的线索投递!IT之家7月9日消息今天Android11Beta2发布,外媒发现在Google智能家居峰会的一段视频中提及Android11正式版……2023苏州马拉松倒计时,赛道解锁先睹为快,每一公里都令人期三月的苏州,草长莺飞,春花烂漫。距2023苏州马拉松开赛仅剩最后2天,首届苏马赛道是怎样的?一路上都有哪些美景?今天,记者跟随苏马组委会提前解锁了苏马的全马赛道,带你先睹为快。……营山这座逐渐消失的桥,承载了多少人的记忆?湛蓝的天空、寂静的河水、葱郁的树木、挺立的石桥、嬉水的孩童。。。。。。或许,这才是我们心中大多数关于桥的样子。时代更迭、城市不断发展,河流声被车流声淹没,树木草丛被钢筋水……小米10ProRedmiK30Pro正适配安卓11,本周暂停感谢IT之家网友孟孟的安安的线索投递!IT之家6月22日消息小米社区发布最新开发版内测公告,由于临近端午假期,本周只发22日、23日两天内测,公测暂停一周;由于正在确认影……小米6MIX2Note3等正式停止MIUI12开发版内测公测感谢IT之家网友darKuro無心的线索投递!IT之家6月21日消息小米社区MIUI近期发布公告,为小米6、红米Note5、小米6X、小米Note3、小米MIX2等机型带……微软正为SurfaceDuo折叠屏开发安卓11系统IT之家6月19日消息微软SurfaceDuo最初于去年10月发布,自发布以来,微软一直保持相对沉默。根据最近的泄密消息,微软SurfaceDuo最早可以在8月推出,搭载骁龙8……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网