RPC-client异步收发核心细节.pdf

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RPC-client异步收发核心细节

RPC-client异步收发核⼼细节 通过上篇⽂章的介绍,知道了要实施微服务,⾸先要搞定RPC框架,RPC框架分为客 户端部分 服务端部分。 RPC-client的部分又分为: (1)序列化反序列化的部分 (上图中的1、4 ) (2 )发送字节流 接收字节流的部分 (上图中的2、3 ) 前⼀篇⽂章讨论了序列化 范序列化的细节,这⼀篇⽂章将讨论发送字节流 接收字 节流的部分。 客户端调⽤又分为同步调⽤ 异步调⽤ 同步调⽤的代码⽚段为: Result = Add(Obj 1, Obj 2);// 得到Result之前处于阻塞状态 异步调⽤的代码⽚段为: Add(Obj 1, Obj 2, callback);// 调⽤后直接返回,不等结果 处理结果通过回调得到: callback(Result){// 得到处理结果后会调⽤这个回调函数 } 这两个调⽤⽅式,RPC-client⾥,处理⽅式也不⼀样,下⽂逐⼀叙述。 RPC-client同步调⽤ 所谓同步调⽤,在得到结果之前,⼀直处于阻塞状态,会⼀直占⽤⼀个⼯作线程,上 图简单的说明了⼀下组件、交互、流程步骤。 上图中的左边⼤框,就代表了调⽤⽅的⼀个⼯作线程。 左边粉⾊中框,代表了RPC-client组件。 右边橙⾊框,代表了RPC-server 。 蓝⾊两个⼩框,代表了同步RPC-client两个核⼼组件,序列化组件 连接池组件。 ⽩⾊的流程⼩框,以及箭头序号1-10 ,代表整个⼯作线程的串⾏执⾏步骤: 1)业务代 发起RPC调⽤,Result=Add(Obj 1,Obj 2) 2 )序列化组件,将对象调⽤序列化成⼆进制字节流,可理解为⼀个待发送的包 packet 1 3 )通过连接池组件拿到⼀个可⽤的连接connection 4 )通过连接connection将包packet 1发送给RPC-server 5 )发送包在⽹络传输,发给RPC-server 6 )响应包在⽹络传输,发回给RPC-client 7 )通过连接connection从RPC-server收取响应包packet2 8 )通过连接池组件,将conneciont放回连接池 9 )序列化组件,将packet2范序列化为Result对象返回给调⽤⽅ 10 )业务代 获取Result结果,⼯作线程继续往下⾛ RPC框架需要⽀持负载均衡、故障转移、发送超时,这些特性都是通过连接池组件去 实现的。 连接池组件 典型连接池组件对外提供的接⼜为: int ConnectionPool::init( ); Connection ConnectionPool::getConnection(); intConnectionPool::putConnection(Connection t); 【INIT】 和下游RPC-server (⼀般是⼀个集群),建⽴N个tcp长连接,即所谓的连接“池” 【getConnection】 从连接“池” 中拿⼀个连接,加锁 (置⼀个标志位),返回给调⽤⽅ 【putConnection】 将⼀个分配出去的连接放回连接“池” 中,解锁 (也是置⼀个标志位) 如何实现负载均衡? 回答:连接池中建⽴了 ⼀个RPC-server集群的连接,连接池在返回连接的时候,需 要具备随机性。 如何实现故障转移? 回答:连接池中建⽴了 ⼀个RPC-server集群的连接,当连接池发现某⼀个机器的连 接异常后,需要将这个机器的连接排除掉,返回正常的连接,在机器恢复后,再将连 接加回来。 如何实现发送超时? 回答:因为是同步阻塞调⽤,拿到⼀个连接后,使⽤带超时的send/recv 即可实现带超 时的发送和接收。 总的来说,同步的RPC-client的实现是相对⽐较容易的,序列化组件、连接池组件配 合多⼯作线程数,就能够实现。还有⼀个问题,就是 【“⼯作线程数设置多少最为合 适?”】,这个问题在之前的⽂章中讨论过,此处不再深究。 RPC-client异步回调 所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线 程处于阻塞状态,因此异步回调的模型,理论上只需要很少的⼯作线程 服务连接就 能够达到很⾼的吞吐量。 上图中左边的框框,是少量⼯作线程 (少数⼏个就⾏了)进⾏调⽤ 回调。 中间粉⾊的框框,代表了RPC-client组件。 右边橙⾊框,代表了RPC-server 。 蓝⾊六个⼩框,代表了异步RPC-client六个核⼼组件:上下⽂管理器,超时管理器, 序列化组件,下游收发队列,

文档评论(0)

ipbohn97 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档