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

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系列文章会陆续更新,欢迎各位小伙伴关注后面的技术分享。

山西这里夜景美如画,一生一定要来一次!爱上平遥也许是因为一段故事也许是因为一场演出也许是因为一座古老的房子也许是从它的夜市开始。。。。。。平遥古城,位于山西中部,是一座具有280……数字经济产业能够与制造业融合,其因素及路径有哪些?一、产业融合的动力因素(1)市场需求的变化与升级。一方面,大型互联网平台、5G互联网等数字技术应用的迅速崛起为数字核心产业化贡献了新技术、形成了新产品生产链条、创造了新市……iPhone13Pro今夜2000首发预售,苹果产品抢购完全写在前面抢购这事,照理说不该拿到台面上讨论。一来,抢购是厂商备货不足造成的不必要的市场混乱;二来,理性的消费者不会对商品妥协,买不到就不买呗。故本抢购指南不是号召大家去踩……我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇风是从哪儿来手上的狗尾巴草摇的更剧烈稻穗也晃起来我紧握着你的手把它拍成照片我们俩转就像大风车早该逃离这我转转……13!曼联6轮首败,C罗首发当队长,打满90分钟,评分不及格曼联客场对阵阿斯顿维拉。曼联13输球,遭遇近6场比赛首败,仍然排在第5位。C罗打满90分钟,有过3次射门,吃到一张黄牌,获评5。9分,不及格。C罗连续第4场比赛首发,并且……跳过iPhone13Pro直接发布14?历史显示苹果并不迷信北京时间9月11日消息,苹果将在下周举行iPhone发布会,它是否迷信这个问题,届时将会见分晓。图:苹果CEO蒂姆库克苹果将于当地时间下周二发布iPhone13。但……十三香发布在即,苹果iPhone13ProAppleWatc还有不到四天的时间,今年最受期待的苹果发布会就要拉开帷幕了。虽然今年的这场发布会仍然采取了线上录播方式举行,但苹果今年最重量级的年度新品iPhone13系列、iPadmi……国家发改委答南都跨国公司高管密集来华,外企加码投资中国南都讯记者陈秋圆发自北京一季度经济数据已出炉,投资方面,全国固定资产投资(不含农户)同比增长5。1,其中内资企业增长5。3,港澳台商企业下降3。4,外商企业增长3。7。今年以来……苹果对抗反垄断监管机构的策略一次修正一项规则9月6日消息,过去几周,苹果对其AppStore的规定进行了几次调整,允许更多公司获得较低的佣金率,这意味着许多开发者将不再需要向苹果支付高达30的应用商店佣金,以解决美国的开……爱因斯坦场方程是一个生产怪象的机器,引出了很多难以置信的现象黑洞是爱因斯坦场方程的一个预言,是恒星在死亡过程中的最后一幕。黑洞的一个最独特的特征是它们可能是通向另一个宇宙的通道。科学界还有一种有趣的猜想黑洞可以打通一条时间隧道。为……苹果新专利MacBookPro有望搭载健康传感器IT之家9月7日消息未来的MacBookPro可能会搭载类似AppleWatch中的传感器。从最新专利来看,苹果正在研究如何在掌托表面添加生物识别监测控件。IT之家了解到……苹果AirPower曝光,iPhone充电时自带动画IT之家8月6日消息苹果设备收藏家GiulioZompetti在Twitter上分享了一段AirPower原型机的展示视频,首次将这款传说中的充电器带到公众眼前。从视频来看这款……
攻克VPU核心技术!智绘微电子自研国产GPU加速国产GPU芯片厂商据智绘微电子日前官方宣布,旗下IDM系列GPU的第二款产品IDM929,已于近日完成设计,即将进入流片阶段,预计2023年内推出。现在,智绘微又带来了好……卢伟冰不讲武德,K60再次降价,12GB256GB跌至269作为小米旗下的子品牌,红米一直以来主打极致性价比,通过强悍且亮眼的硬件配置,加上亲民的价格,吸引了很多用户的追捧,也被很多用户调侃为焊门员,不过随着一加、realme等品牌的打……F1比利时大奖赛维斯塔潘第14位发车强势夺冠新华社布鲁塞尔8月28日电一级方程式赛车(F1)比利时大奖赛28日在斯帕赛道展开正赛争夺。红牛车手维斯塔潘第14位发车,但仅仅18圈后就取得领跑位置,最终轻松夺冠。在27……三星GalaxyS23Ultra曝光18GB运存2亿像素,这从目前的手机市场来看,只有差异化的产品设计,才能吸引到消费者的眼球,而只有真正重视产品体验的厂商,才是能够留住顾客的。在这个全面屏幕的时代,一款有特色、有质感的全面屏幕手机,必……新疆14家旅行社组团赴阿拉木图踩线新疆网讯(记者吴治杰)4月9日晚,新疆14家出境旅行社组团赴哈萨克斯坦阿拉木图进行旅游踩线活动正式出发,拉开新疆开展百团千人游中亚活动序幕。据新疆旅行社协会吴峰会长介绍,……霍启刚带仨娃爬山,霍中曦帮忙照顾妹妹,兄妹仨同框画面温馨自从霍启刚娶了跳水皇后郭晶晶后,夫妻恩爱和谐,接连生下2女1子,一家五口幸福地生活在一起,备受大家的关注。霍启刚和郭晶晶为孩子树立了一个良好的榜样,在他们悉心的教导下,仨……官宣,2大坏消息前中国女排主帅去世,中国男排被迫弃权北京时间6月20日,官方消息,中国排球传来了2个坏消息。中国男排因为身体原因被迫放弃了比赛,球迷们也对小伙子们的身体表达了关心。另外一个消息是,前中国女排主帅李耀先同志去世。……冬吃萝卜夏吃姜,医生肿瘤患者不能乱吃萝卜俗话说:冬吃萝卜夏吃姜,不劳医生开处方。目前正是萝卜大量上市的时候,价格低,口感好,无论是暖暖的羊肉汤还是爽口的排骨汤,加上萝卜犹如锦上添花,喝上一碗更是暖心暖胃。冬天吃……霍童溪乡村振兴文化带沿溪而行处处皆风景春节期间,位于蕉城区霍童镇文湖村的花漾湾乐园热闹非凡,近300万个七彩风车装扮出的风车田园画,仿佛将人们拉入童话世界,游客们着汉服、放纸鸢、打卡拍照,尽情享受春日的暖阳和斑斓的……我曾经在东莞堕落过,见过各种奇葩客人,通过自我救赎,完成逆袭我曾也像很多年轻人一样在灯红酒绿的城市里迷失过自己,喜欢沉迷在夜生活里带来的那种刺激感。也曾堕落过,享受过不劳而获带来的快乐。我把自己的经历分享给亲们,是希望通过我的经历告诉大……即时零售时代催化聚合配送给自己加餐买份鲜活大虾,夜里馋嘴了买几袋小零食,给孩子买些急需的草稿纸这些生活中突然想起的购物需求,如今只需在手机上动动指尖就能即时满足。从生鲜蔬菜到休闲零食,从电子产品到日化……看了大家的评价,我终于知道魅族为什么没落了!魅族19能翻身吗要说国内智能手机的鼻祖,不是华为也不是小米而是现在已经没落的魅族,估计很多00后都没有听过这个手机品牌,但早在零几年,魅族M8的地位和iPhone4S的差不多,这样说大家应该可……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网