- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)