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

高并发服务优化篇从RPC预热转发看服务端性能调优

  本篇带大家来看下RPC的一些高级特性和其背后的原因。(还是以开源的dubbo和sofa为例来说明)。Part1RPC为了性能做了哪些努力1。1Provider分组和直连
  路由寻址,负载均衡是很好,可以保证流量均匀从而保护服务节点稳定。
  但是,我们有的时候其实不希望我们的请求乱跑,最好能打到指定的机器上。比如联调和测试的时候,直连功能就显得很重要了。
  只有经历过多方合作联调时请求到处乱跑的痛,才知道分组和直连的功能对开发是多么的友好。以sofa为例Extension(valuedirectUrl,order20000)AutoActive(consumerSidetrue)publicclassDirectUrlRouterextendsRouter{。。。}
  我们可以看到直连路由策略的order属性,被赋予了一个极小的值,变成了优先级最高的路由策略,所以只要配置的直连列表,则会优先走配置中的列表地址。
  摘自:www。sofastack。tech1。2异步调用
  Future异步调用
  异步调用对服务性能和并发的支持起到很大的作用。
  一般异步调用有Futurn和callback等方式,这里我们说下Future的原理:
  调用下游之后,先返回一个Future,上游通过Future。get()方法对结果进行获取,如果结果未返回则会让出CPU资源进入等待,直到结果到达或超时后触发回调方法才被唤醒。由于篇幅问题,Future的核心逻辑的相关注释就不放了,之前的消息消费顺序保障的文章中也有叙述,有兴趣的同学可以看下1。3本地优先、远程优先
  很多时候,我们会遇到消费端和服务端可能都是自己的情况。这个时候,在常规的路由寻址之外,又提供给我们一种调用的可能性,就是直接调用当前服务器上的程序,这样做的好处比较明显,省去了网络传输等时间损耗,效率更高。ListProviderInfolocalProviderInfonewArrayListProviderInfo();解析IP,看是否和本地一致for(ProviderInfoproviderInfo:providerInfos){if(localhost。equals(providerInfo。getHost())){localProviderInfo。add(providerInfo);}}命中本机的服务端if(CommonUtils。isNotEmpty(localProviderInfo)){returnsuper。doSelect(invocation,localProviderInfo);}else{没有命中本机上的服务端returnsuper。doSelect(invocation,providerInfos);}
  当然,也需要看业务和内部服务路由的实际情况,比如在阿里的单元化部署下,需要根据用户ID路由到对应的zone进行处理,如果还是优先本机,那就可能在操作数据库的时候涉及到跨zone调用,比走远程rpc更加耗时。因此这种情况下就需要禁用本机优先策略。1。4延迟暴露
  很多时候,我们的服务需要依赖一些其他内容才可以正常提供服务,比如缓存预热、线程池预热等等,所以,在服务真正就绪之后再注册到配置中心是很有必要的。服务注册之前,先延迟publicvoidexport(){根据配置延迟加载if(providerConfig。getDelay()0){Threadthreadfactory。newThread(newRunnable(){Overridepublicvoidrun(){try{Thread。sleep(providerConfig。getDelay());}catch(Throwableignore){}真正的服务注册逻辑doExport();}});thread。start();}else{doExport();}}1。5粘滞连接
  问:我们需要每次都进行路由寻址和负载均衡来确定服务地址么?
  答:大部分情况是有利的,不过有些特殊的场景,更希望多次请求连接到同一台服务器。
  比如,有状态的服务(很多带数据功能的服务都是有状态的,比如很久之前的带登陆session的Tomcat服务、存储集群服务等),其实希望每次请求都连接到相同的服务器。
  这就用到了粘滞连接功能。protectedProviderInfoselect(。。。)throwsSofaRpcException{判断isSticky粘滞连接配置if(consumerConfig。isSticky()){如果最后一次使用的provider不为空,则使用if(lastProviderInfo!null){ProviderInfoproviderInfolastProviderInfo;获取对应连接ClientTransportlastTransportconnectionHolder。getAvailableClientTransport(providerInfo);if(lastTransport!nulllastTransport。isAvailable()){checkAlias(providerInfo,message);returnproviderInfo;}}}。。。}1。6预热转发
  前面扯了那么多,其实,这个才是我们今天想说的重点。
  预热转发是针对服务节点的负载均衡来说的。因为在服务刚启动的时候,如果请求过多可能会影响机器性能和正常业务,如果将处于预热期的机器的请求转发到集群内其它机器,过了预热期之后再恢复正常,则可以保证服务节点的性能和服务整体的可用性。
  那么这个功能是怎么实现的呢?带权重的随机负载均衡。
  摘自sofastack:权重随机的原理累加总权重totalWeight,代码忽略在总权重内随机得到一个值intoffsetrandom。nextInt(totalWeight);确定随机值落在哪个片断上for(inti0;isize;i){offsetgetWeight(providerInfos。get(i));if(offset0){providerInfoproviderInfos。get(i);break;}}
  配置示例:coreproxyurlweightStarting:0。2,during:60,weightStarted:0。2,address:x。x。x。x,uniqueId:coreunique
  如上,预热权重20,预热持续时长60s。这样,按照上述计算方式,权重小的服务节点被选到的几率就相对小,以此达到权重随机的效果。
  那么,为什么刚发布的服务需要预热呢?预热可以起到什么作用呢?Part2什么是JIT优化
  都说C快,Java慢,都是高级语言,是什么导致了运行速度的差别呢?
  这个涉及到了两种执行方式:解释执行和编译执行。
  相对于C直接将代码编译成机器码运行的方式,Java为了实现跨平台、高度抽象等特性,增加了虚拟机层来实现Java代码到机器码的转换,Java程序先是被编译成符合虚拟机规范的。class字节码逐条将字节码翻译成机器码然后执行,所以,速度上就慢一些。
  虽然,JVM的加入,给Java的运行速度增加了不少损耗,但是好处也很多,除了跨平台,还为我们实现了诸如内存管理、垃圾回收等容器级通用功能,让研发人员可以更加聚焦业务。
  不过,Java也是要面子的,我允许自己慢,但我不允许自己慢那么多!
  怎么办呢?遵循二八原则,是不是可以找寻程序当中的贡献了大部分调用量的核心代码,把这部分编译成机器码,提升其速度,不就把整体的速度提上去了么,JVM也是这么做的
  所以,JVM兼容了解释执行和编译执行两种方式,也就是我们常说的即时编译。
  前面的问题到这里其实就可以回答了。为什么需要预热转发呢?是为了用小流量对程序进行预热,目的是为了让核心代码进行及时编译,提高峰值运行速率,提升服务响应
  下面让我们详细看下JIT。2。1即时编译器
  为了权衡编译时间和执行效率,JVM设置了多种即时编译器:C1(Client编译器):基于字节码完成部分优化,如方法内联、常量传递,相对于C2,速度快,但性能稍差。C2(Server编译器):耗时较长的全局优化,如无用代码消除、重排序、循环展开、公共子表达式替代、常量传播等等。Graal(新的JIT编译器):侧重于性能和语言操作性。在一些负载上提供比传统编译器更好的峰值性能;用Graal执行的语言可以互相调用,可以使用来自其他语言的库。2。2JIT优化触发条件
  前面我们说过,JVM其实是希望找到承担更多调用请求的代码块进行优化,那,怎么来确认哪些代码是优化目标呢?热点探测
  基于采样的热点探测:
  周期采样,检测各线程栈顶方法,经常出现的方法即为热点方法。好处是简单高效,缺点是不精确,容易受线程运行状态的影响。
  基于计数的热点探测:
  (包括方法调用计数器和回边计数器)每个方法建立计数器,用来统计调用次数。如果该方法执行次数超过阈值,则该方法被认定为热点方法。好处是足够精确。缺点是空间损耗大,且实现较难。
  另外,可以通过如XX:CompileThreshold等参数来修改阈值,不过,没有绝对把握,还是不要动为好。Part3JIT指导代码优化3。1方法内联
  为什么我们在刚写代码的时候,总是被建议不要写很大的方法体?方法内联的JIT优化策略就是其中一个重要的原因。(还有GC友好等原因)
  JVM内的每一次方法调用,都是栈帧在内存中出栈入栈的过程,方法多了性能损耗自然大,所以要进行方法内联,即把方法执行逻辑直接复制到调用方内部,避免方法调用。
  但是,方法内联是有方法大小限制的,超过了一定大小的方法,没法做内联优化。所以,平常应该注意,尽量避免写很大很冗长的方法。
  让我们来举个栗子实际感受一下
  两种书写风格的大数相加
  如上图所示,两个字符串型整数相加,都能实现功能,前一种写法,把中间过程全都拆开,罗列在的方法内,整个方法虽然理解起来稍微方便些,但整体显得冗长;第二种方法,把各个条件都囊括在了for循环条件内,三行代码完成整体操作。
  如果要去评价,我觉得大部分人都会说第二种写的好,但是,第二种的好难道真的局限于优雅么?添加JVM启动参数,用于打印代码执行过程中的编译详情XX:PrintCompilationStringnum112345;Stringnum223456;循环15000次,因为1。8分层编译下,各层阈值不一样,我们取最大阈值for(inti0;i15001;i){rejectionLB1。stringAdd(num1,num2);rejectionLB1。stringAdd2(num1,num2);}
  执行15000次写法1
  (图中编译层次这一列中,3代表C1编译,4代表C2编译)
  我们看到,随着代码的执行次数的增加,一些方法,进行了C1编译,如我们的主方法stringAdd,而少数方法,从C1编译提升到了C2编译,如AbstractStringBuilder::append方法。
  执行15000次写法2
  我们看到了什么,stringAdd2居然在进行到运行后期执行了C2编译,而且很明显,方法二的C2编译的方法,比方法一要多不少。所以,平常写代码该注意些什么,是不是显而易见了3。2其他优化
  方法内联虽然只是一种简单优化,但是,是后续其他优化的基石。
  而JVM的分层优化涉及的点非常多〔1〕:
  局部优化:关注局部数据流分析,数组越界检查消除;寄存器优化,优化跳转、循环、异常处理等;代码简化,如公共表达式提取等等等。
  控制流优化:专注于代码重排序、循环缩减、循环展开、异常定位优化等等等。
  全局优化:主要关注冗余消除,如方法调用、锁;逃逸分析;GC和内存分配优化等等等。Part4总结
  本篇从RPC的预热转发功能,引出了其背后的理论依据JIT优化。阐述了JIT的基本概念,并用一个实例说明了代码编写风格对JIT优化的实际影响。
  JIT相关的优化实现起来非常难,不过其原理和作用对我们普通研发也不是特别难理解,学习JIT优化的目的,在于了解JVM底层的运行逻辑和实现,让我们可以更加信任托管,聚焦业务逻辑,同时在编写代码时,尽量用JVM友好的方式进行,从而达到更好看、更高效的目的。
  来源:https:mp。weixin。qq。comspktzfRuXc3PEb172zw4qNQ

鬼语迷城人物,鬼宠攻略1。人物介绍摸金校尉输出职业,拥有远距离的强力输出能力以及高致命的优势。但血量低,防防御低,生存能力低,需要非常强的操作能力,即缺乏辅助能力。卸岭力士肉盾战士,血高皮厚,有控制技能恒腾网络与腾讯签订合作协议,将展开游戏领域全面合作近日,腾网络发布公告称,集团将与第二大股东腾讯签订合作协议,附属公司深圳市景秀网络科技有限公司与腾讯计算机在游戏技术服务和渠道推广方面进行合作。据了解,恒腾网络即将更名为中国儒意。火影手游人气角色秽土鼬初次爆料,防反机制优秀,附带抓取火影手游里面要说强度那肯定还是得看高招忍者,当然氪金忍者强度也有(想爱情哥暴怒小孩咒印鸡翅佐助),但是这毕竟只是少数,忍法帖的忍者也是接近高招的水准,也只是少数,主流的还是得看高招王者荣耀S26开启时间确定,S25提前结束,部分ID将面临封号本期看点S26开启时间确定,S25提前结束,部分ID将面临封号文资源君大家好,我是资源君,本期我们来聊一聊S26赛季的开启时间,然后再提醒大家一下,赛季更新的时候,新赛季的开启时间DOTA2液体已然锁定major名额,新赛季暗流涌动DPCS联赛欧洲组别,Liquid在五连胜后提前确定了主要席位。球队的新队员Zai和Matambaman为球队做出了重大贡献。这个新阵容在西欧的S联赛中发挥的很好。他们赢得了所有五另类鱿鱼游戏十三骇人游戏天上星河转,人间帘幕垂。欢迎大家走进星空放映室。相信大家前段时间肯定被大火的韩国剧集鱿鱼游戏刷爆了朋友圈。(没看过的小伙伴可以去抖音自行科普,不建议看完整版,略长,而且是电视剧的形吃鸡不玩游戏后退款4820?玩家等待了3天,收到1个审核结果欢迎诸位小伙伴们来到天哥开讲的和平精英精英小课堂俗话说得好天下没有不散的筵席,这句话无论是放在现实里还是游戏里,都同样如此。以陪伴我们将近4年之久的和平精英为例,老玩家的好友栏里出EDG与BLG训练赛战绩曝光!Uzi阵亡次数最多,刘青松ID瞩目前言距离2022LPL春季赛开赛还有两天的时间,各大战队都进入了更加紧张的训练当中。不过,因为疫情管控原因,许多战队的主力选手也刚会合不久,训练赛情况是不容乐观的。在1月8日下午,人们为什么喜欢Steam?我前一段时间,下载过一个微软的著名赛车游戏地平线4(学习版本,你们懂的)!百度网盘下载了10小时,因为大小有110G。是的,现在的游戏就是这么大!现在的玩家要求画面清晰,还希望有旷智能汽车自动驾驶域控制器电话会议背景2020与2021是汽车电动化加速过程,2021Q4新能源渗透率超20。2022将有很多L2以上智能汽车落地,带来域控制器芯片激光雷达毫米波摄像头等机会。一徐一清1。一级架构E英雄联盟免费改名活动正式开启!时间持续一个月,游戏ID推荐前言万众期待的英雄联盟免费改名活动终于正式开始了,这队友豹子头玩家来说,无疑是深受关注的活动。毕竟有很多玩家都是在年龄还不是很大的时候就入坑了,至今为止已有好几年,而游戏ID一直都
在你犯错时及时批评你的人,一定要珍惜阅读文章前,请思考以下5句话1一般人被批评时,心里会不痛快。2当一个人去批评另一个人时,也知道对方心里会不痛快。3如果是关系一般的人,你批评他就会得罪他,所以犯不上因批评对方而得罪有时候,懂得低头也是一种智慧人性是固执的,做到低头也是困难的,如果不懂得在现实面前适时的低头,人生也就不会有太大的成就,懂得适时的低头,是一种巧妙的智慧,沉稳的成熟。谷子成熟了,就低下了头,向日癸成熟了,也低英雄联盟北美deft离队,世界冠军bang也曾在此服役最近一支北美LCS赛区的战队EG战队官宣了deft,不,是deftly选手的离队,不明真相的许多观众很容易就把这位选手认成同为下路的韩国著名电竞选手deft选手,从而疑惑deft何英雄联盟双杀DK!RNG挺进淘汰赛2021MSI季中邀请赛的对抗赛环节已经落下帷幕,最终来自LPL中国赛区的RNG战队已经成功以小组第二的形式出线,而LCK赛区的DK战队尽管以第一的名次出线却在对抗赛阶段两度输给R英雄联盟RNG每日一败,UZI粉丝不要碰瓷MSI对抗赛阶段已经结束,被我们寄予厚望的RNG战队,其实打得不错,尽管没有来到榜首的位置,但是在赛程前段展现出的非凡统治力以及第一局就挫败DK让大家有了很多的联想,诸如全胜拿下冠英雄联盟C9亮妖姬?RNG高速偷家直取C9基地在拳头游戏举办的英雄联盟2021MSI季中邀请赛的对抗赛阶段,LPL赛区的代表队对上了来自北美LCS的新王C9。RNG在沉寂三个赛季以后,以全新的班底拿到了lpl2021春季赛的冠人生有三苦,熬过去,便是幸福人生在世,实在有很多苦不堪言的时候生活的困苦,精神的痛苦,命运的悲苦,无时无刻不折磨着原本脆弱的我们。每当这个时候,我们总会产生诸多情绪的困扰心灵的挣扎和无谓的彷徨。其实,只要静守英雄联盟又偷家了!RNG再现折磨战术,MAD敢怒不敢言MSI季中邀请赛已经进行到了第二阶段的对抗赛阶段。RNG在面对DK,C9等强敌毫无怯色,在面对欧洲新皇MAD时甚至玩出了新花样。惹得现场解说惊呼屠龙者终成恶龙。三十六分钟的比赛里,游于现实游戏中的阴阳师在历史中究竟是种怎样的存在?观众朋友们大家好,欢迎观看本期游于现实,这期视频我们要讨论的是日本的一个神秘又特殊的职业阴阳师随着游戏与动漫行业在国内的迅速发展,以日本平安时代最强阴阳师安倍晴明为首,阴阳师这一团十二月有趣的手游盘点追妖记追妖记是一款放置修仙与Roguelike结合的策略性游戏!仙友们主要通过门派修炼禁地战斗装备强化法宝佩戴灵兽培养等方式来提升角色战斗力,角色得到强化后,可以通过更高的关卡,一十一月再也不无聊,这几款手游让你爽到爆波西亚时光波西亚时光是一款3D模拟经营RPG游戏。游戏的世界背景设置在世界毁灭之后,文明重新复苏的时代。主角来到波西亚小镇,继承父亲留给他她的一座工坊。主角需通过砍伐采集挖掘战斗种
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网