-
Notifications
You must be signed in to change notification settings - Fork 45
2 建立RPC client异步框架
从这一节开始,跟随我们多年的小兄弟client要退休了,取而代之的是同步调用客户端:tar-client和异步调用客户端:tar-client-async,rpc的client端性能至关重要,直接影响到外界系统的调用表现。
执行./run.sh 会生成tar-client
-
程序入口在tar_client.cpp
-
建立ReqMessage,放入ReqInfoQueue中,并通知CommunicatorEpoll
-
CommunicatorEpoll的run()得到通知后,根据pFDInfo->iType的类型进行处理
-
本节功能只更新到建立连接,还不能发送接收消息
关于执行./tar-client出现“doConnect errno is 115”提示的解释:
115:当链接设置为非阻塞时,目标没有及时应答,返回此错误,socket可以继续使用
今天终于完成了tar-client的同步调用,过程是比较痛苦的,结果是快乐的~~~
函数的调用流程梳理如下:
黑色箭头为client发送请求的流程,红色箭头是client接收来自tar-demo结果的流程
需要注意的地方:
-
ObjectProxy::invoke(ReqMessage * msg)函数中对msg->sReqData进行了序列化操作,把msg->iRequestId也作为请求的一部分发送给了服务端,服务端结果的返回也会带上这个iRequestId
-
在ObjectProxy::finishInvoke(const string& rsp)方法中,_timeoutQueue承担了一个请求和返回的上下文保存功能,通过返回结果中的iRequestId找到请求的msg,把返回结果放入msg->response中
执行./run.sh 会生成tar-client-async
异步调用的实质就是返回结果在另外线程处理,与同步调用相比,异步调用就是将返回结果放到了一个单独队列,AsyncProcThread线程从这个队列中拿取结果调用回调函数,如下图所示:
-
虚线框是相比同步调用增加的异步流程
-
蓝色的虚线框是为了异步处理结果新启动的线程,等待在队列上,一旦有新的结果进入队列,就取出调用回调函数进行处理