专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

RabbitMQProducer之publisherconf

  前几篇文章主要介绍了Producer的mandatory参数,备份队列和TTL的内容,这篇文章继续介绍Producer端的开发,主要包括发布方确认和事务机制。发布方确认
  消息持久化机制可以保证应服务器出现异常导致消息丢失的问题,但是Producer将消息发送出去,并不知道消息是否正确到达服务端并持久化。如果未到达服务端,或者到达服务端未持久化到磁盘,消息就丢失,那么问题仍然存在。如下图,第一步或者第二步出现问题,消息依然会丢失。
  RabbitMQ为解决这个问题,提供了发布方确认(PublisherConfirm)机制。
  生产者将Channel设置成confirm模式,所有在该channel上发布的消息都会被指派一个唯一的ID(序号从1开始),消息被路由到队列之后,RabbitMQ就会发送一个确认(ack,包含此消息的ID)给生产者,这样生产者就知道消息已经正确发送到RabbitMQ了,如果消息是持久化的,RabbitMQ会等到消息落盘再回复。RabbitMQ回复的消息包含了deliveryTag,表示确认消息的序号,还包含multiple,表示到这个消息序号之前所有的消息都已得到处理了。
  下面通过代码演示发布方确认的使用。channel。confirmSelect();Stringmessagetestack;channel。basicPublish(exchange,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,message。getBytes());如果没有调用comfirmSelect方法开启,直接调用waitFormConfirms会报java。lang。IllegalStateExceptionchannel。waitForConfirms();
  此方式也是串行同步等待的方式,生产者发送消息之后,会被阻塞,直到RabbitMQ接收到消息返回(对于持久化消息,等待消息落盘后才返回),生产者接收到ack才会下一条消息的处理,这显然会有性能问题。
  解决方案有两种:批量发送确认异步确认
  批量发送
  批量发送方法,客户端程序需要定量或者定时调用waitFormConfirms方法等待RabbitMQ的确认返回,相对于上面的方式,性能有极大的提升。
  下面是批量发送的代码实现。channel。confirmSelect();intMsgCount0;while(true){channel。basicPublish(exchange,routingKey,null,batchconfirmtest。getBytes());将发送出去的消息存入缓存中,缓存可以是一个ArrayList或者BlockingQueue之类的if(MsgCountBATCHCOUNT){MsgCount0;try{if(channel。waitForConfirms()){将缓存中的消息清空}将缓存中的消息重新发送}catch(InterruptedExceptione){e。printStackTrace();将缓存中的消息重新发送}}}
  但也有问题,当同一批次中出现消息被nack或者超时,需要客户端程序处理并重试,这有可能导致消息重复。
  异步发送
  异步方案是推荐使用的方式,它的优点初了性能优良之外,还有只需要在回调方法nack中处理没有被RabbitMQ成功处理的消息,SpringAMQP中也是这种方案。
  实现的时候,只需要添加ConfirmListener接口的实现,它主要有两个方法:handleAck和handleNack。下面是代码实现,是SpringAMQP的精简版(关于SpringAMQP的细节,小伙伴们可以关注RabbitMQ系列文章后续的更新)。维护消息序号和消息,在回调函数中做相应处理SpringAMQP也是这种方案,只不过这里简化了ConcurrentSkipListMapLong,StringunconfirmMapnewConcurrentSkipListMap();channel。confirmSelect();channel。addConfirmListener(newConfirmListener(){publicvoidhandleAck(longdeliveryTag,booleanmultiple)throwsIOException{System。out。println(Nack,SeqNo:deliveryTag,multiple:multiple);if(multiple){confirmMap。headMap(deliveryTag1)。clear();}else{confirmMap。remove(deliveryTag);}}处理发送失败的场景,尝试重发publicvoidhandleNack(longdeliveryTag,booleanmultiple)throwsIOException{System。out。println(handleNack:deliveryTagmultiple);注意:为防止消息一直失败,导致死循环,可以在消息上加属性xretries,每次重发前,先判断已经发送的次数,达到阈值,不再发送if(multiple){ConcurrentNavigableMapLong,StringheadMapunconfirmMap。headMap(deliveryTag1);SetMap。EntryLong,StringentrySetheadMap。entrySet();IteratorMap。EntryLong,StringiteratorentrySet。iterator();while(iterator。hasNext()){Stringremovediterator。next()。getValue();channel。basicPublish(exchange,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,removed。getBytes());}}else{StringremovedunconfirmMap。remove(deliveryTag);channel。basicPublish(exchange,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,removed。getBytes());}}});模拟一直发送消息while(true){longnextSeqNochannel。getNextPublishSeqNo();channel。basicPublish(exchangeName,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,msg。getBytes());confirmSet。add(nextSeqNo);}事务机制
  事务机制是解决发送端无法感知消息是否正确达到服务端的另外一种方案。事务的使用非常简单,先直接上代码感受下。Stringmessagetxmessage;try{channel。txSelect();channel。basicPublish(exchange,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,message。getBytes());channel。txCommit();}catch(Exceptione){e。printStackTrace();channel。txRollback();}
  使用txSelect方法开启事务,只有消息成功被Rabbit接收,事务才会提交,如果发生任何异常,消息都会被回滚。
  使用事务的缺点就是性能问题,因为发送一条消息之后,会阻塞发送端,直到Rabbit把消息持久化到磁盘,才会返回响应给发送端,之后发送端才能继续发送下一条。所以推荐使用PublisherConfirm方案。
  好了,以上Producer使用PublisherConfirm和事务发送消息使用了。
  RabbitMQ系列文章会陆续更新,欢迎各位小伙伴关注后面的技术分享。

都21世纪了,见王室还要行跪拜礼,泰国王室地位为何这么高?在泰国旅游期间,中国游客除了观光以外,还对一件事情特别好奇,那就是跪拜礼。所有的泰国人,只要见到国王王后王子和公主等王室成员时必须即刻跪拜,而且还是整个身体都要直接匍匐趴在地上的超苹果系统怎么安装,你会了吗?苹果系统怎么安装,我们安装最多的是windows系统,那么苹果系统怎么重装系统了,接下来小编就告诉你!MAC电脑重装系统的步骤如下1将引导盘插入电脑,按键盘上Option键或Alt白鹤滩水电站全面投产发电我国建成世界最大清洁能源走廊光明日报北京12月20日电(记者温源周洪双)20日上午9时,世界技术难度最高单机容量最大装机规模第二大水电站白鹤滩水电站最后一台机组顺利完成72小时试运行,正式投产发电。至此,白鹤智能手机日薄西山,舜宇光学能否华丽转身?能够精准附和到时代脉搏的公司并不多见,而舜宇光学科技(02382。HK)则属于典型的见风使舵型公司。二十年前,舜宇光学以传统相机镜头为跳板,直接跳到手机光学领域,随着智能手机的雄起裕仁天皇逃脱战后审判却永远洗不脱罪行的日本头号战犯!(一)在美国主子面前卑躬屈膝的裕仁天皇(右一)01hr1989年的日本东京,执政长达63年之久的昭和天皇裕仁死于十二指肠癌,终年88岁。裕仁是日本在位时间最长的天皇,日本人心目中响当当的这档综艺,仅用一期就暴露了娱乐圈五条众人看破不说破的隐藏规则娱乐圈是个竞争激烈的名利场,很多明星的光鲜亮丽,仅只是表面现象。当他们的工作生活被镜头放大以后,大多数人也同样需要面对现实的残酷一面。比如在最近开播的综艺无限超越班中,仅仅一期节目相隔半年,vivoX90比上一代X80升级了哪些功能?价格相同买哪个?价格同样为3699起步,发布时间仅隔半年,vivoX90新品又给大家带来了什么样的升级呢?相比上一代X80,哪个更值得入手,本文就带大家一起来看看vivoX90这款手机,外观性能摄iPhone14Plus销量惨淡,苹果明年将重新划分其功能和价格IT之家12月20日消息,援引国外科技媒体DigiTimes报道,苹果主要代工厂和硕今年11月度的营收惨淡。除了消费电子行业进入传统淡季之外,另一个重要原因就是消费者对iPhone无线三模热插拔机械键盘,价格亲民嘎嘎好用!对于游戏爱好者来说,一把趁手的机械键盘是不可或缺的,而对于很多的大学生来说,高昂价格的键盘并不是每个人都能负担的起,而往往一把可玩性高且价格实惠的机械键盘,则会很受欢迎。就正如我手微信输入法距离取代传统输入法只有一步之遥?在经过数轮测试后,微信键盘终于在12月19日正式上线各大应用商城,包括AppStore,而在此之前都只能通过申请微信读书的灰度测试,或是下载别人共享的安装包来体验。正式上线的1。0微信键盘登上App热门榜可调用微信内资源,强调隐私保护记者徐诗琪编辑12月19日,微信键盘App登陆苹果与安卓应用商店,并在当天登上了AppStore工具类免费榜第一。2021年初,张小龙在每年一度的微信公开课上就曾提到,微信将推出自
尿酸高怎么办?医生教你两招,帮你有效降尿酸很多人体检发现尿酸高了,内心就会很恐慌,害怕自己以后会发展成为痛风,今天医生就来告诉大家两招,帮你有效降尿酸!首先我们要了解为什么会出现尿酸增高的现象?尿酸是人和其他灵长目动物嘌呤经常耳鸣怎么办?别担心!三甲医生给出了这6种办法本文由深圳市中医院管宏钟主任医师原创耳朵是最早具有完全功能的人体感觉器官,耳鸣在原始社会非常少见,远古时代的人类每天在广袤的草原上奔跑追逐猎物躲避猛兽,而身体却非常强壮。反观智能时发射疼痛怎么回事?医生提醒有3大诱因,别不当回事S精疼痛可以说是男科常见的问题,其原因也可大可小,但是大部分都离不开这三个因素。1。和性生活强度有关如果男性朋友很长一段时间都没有经历性生活后,突然增加性生活的频率,就像一个长时间美女在美国豪华俱乐部当服务员,仅一天小费就4800欧美的小费文化非常厉害。吃饭的话,正常的小费差不多是15左右,如果满意的话,会给更多,譬如1820,如果不满意,除非很有意见,一般也得给个10。但是,高端餐厅,高端服务业,小费就更大彻大悟之人,曾经都死过一次作者吾以为然在周星驰的西游降魔篇中有句话有了执着,可以放下执着,有过牵挂,了无牵挂。剧中的唐玄奘本就是一个执迷不悟,无可救药的人。靠着儿歌三百首到处降妖除魔,他被人嘲笑,但是依然在5月27日,历史上的今天发生了什么?今天是2022年5月27日,农历四月二十七,历史上的今天发生了什么,让丫头给大家捋捋。公元893年的今天,西蒙一世缔造了强大的保加利亚帝国历史上,沙皇并不是俄罗斯人所独有的。早在俄油价调整最新消息今天5月26日,9295号汽油预计上调345元吨按照新一轮油价调整的第8个(5月25日)工作日原油变化率数据显示,原油变化率为7。88,预计上调油价345元吨,折合升计算为上调油价0。26元升0。31元升,2022年5月30日(小学教材插图中的荒唐人教版小学教材中的插图让人看了简直匪夷所思。不光缺乏美感,有些情节仔细看简直荒唐!中国孩子身上穿美国星条旗T恤国旗竟然画错了这是没穿裤子还吗?很难想象这种插图出自于专业的具有高水平黄晓明新恋情疑似曝光?是知名网红原深圳校花?黄晓明那会和杨颖的那场婚礼办的那叫一个轰轰烈烈,请了大半个娱乐圈的人参加,份子钱都需要用四个保险箱来收,而最后两人也是以离婚收场,如今再来看那场世纪婚礼就多少显得有些讽刺了。而今天将怀孕妻子打到流产!如果他不被封杀,娱乐圈真的没救了对任何暴力说不!不知道近期大家有没有在短视频平台刷到过这个视频。一名男子翻着白眼,歪着嘴,露出一副不屑的表情。随即转脸对着屏幕,脸上的表情变为凶狠,随之而来的就是如雨点一般落下的拳博士逗流浪猫被处分?上海交大回应点蓝字关注,不迷路5月26日,一则网传上海交通大学徐汇校区疫情防控期间对于博士研究生孟某相关情况的通报引发热议,冲上热搜第一。26日,上海交大方面对澎湃新闻记者表示,疫情期间,学校
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网