码迷,mamicode.com
首页 > 其他好文 > 详细

tars framework 源码解读(五) servant部分章节。客户端部分。客户端部分的一些类及其配置细节

时间:2020-01-15 19:44:57      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:统计   int   data   参数设置   关闭   notify   and   时间间隔   enum   

ServantProxy

很有意思的是,服务端的实现叫Servant,对应客户端连接器的名就叫ServantProxy,顾名思义,是客户端连接的代理.

 

selectNetThreadInfo的实现:

1获取ServantProxyThreadData pSptd;

2如果pSptd还没初始化过,先new本Servant ObjectProxyNum个ReqInfoQueue队列并赋值给pSptd->_reqQueue,这个ObjectProxyNum正好也是Servant的ObjectProxy线程数。

3、如果是只有一个ObjectProxy。那没得说就用第一个。

如果不止一个,则有两种情况:

若pSptd->_netThreadSeq为非0(表示网络线程发起的请求回到自己的网络线程来处理,其值为网络线程的id),则选择_netThreadSeq这个线程序号对应的ObjectProxy和ReqInfoQueue队列返回。

否则,轮询这些ObjectProxy,将对应的ObjectProxy和ReqInfoQueue队列返回。当前所轮询到的id 放在_netSeq变量中。

 

ServantProxyThreadData

线程私有数据管理类。

这里有个每个线程跟客户端网络线程通信队列,ReqInfoQueue数组。数组大小为客户端最大网络线程数MAX_CLIENT_THREAD_NUM 默认MAX_CLIENT_THREAD_NUM=64个。另外ReqInfoQueue自己是typedef TC_LoopQueue<ReqMessage*,1000> ReqInfoQueue。

可以说每个ObjectProxy对应的客户端线程的消息队列 默认是1000个,但可通过配置中<reqqueuenum>更改..

另外这个类中还有CoroutineScheduler协程调度器 这种很重要的

 

ObjectProxy

每个objectname在每个客户端网络线程中有唯一一个objectproxy

1、初始化阶段:

1]如果启用set,设置指定set调用时,指定set的优先级最高

2]设置ProxyProtocol协议解析器 默认协议解析器:

requestFunc=ProxyProtocol::tarsRequest();

responseFunc=ProxyProtocol::tarsResponse();

协议名称为 tars

可以通过setProxyProtocol()函数更改协议解析器

3]创建一个EndpointManager对象。将ProxyName和setName,以及Communicator传入.也就是一个objectproxy一个EndpointManager

2、重要函数说明:

1、invoke..从CommunicatorEpoll->handle()中过来的,当他队列中有要处理的消息过来时候,就会调用此函数.

2、doInvoke..从EndpointManager->doNotify()中过来的..看起来是主控的请求响应到了doEndpoints或者是主控请求响应异常doEndpointsExp,EndpointManager给objectproxy发一个通知。查看《完整的tars调用流程详解》章节部分的内容

 

EndpointManager

框架内部的路由管理的实现类

 

AdapterProxy类的实现

这个ServantProxy如果存在,后面就不再建立。那么问题来了,这个是长链接吗?

 

 

 

CommunicatorEpoll

客户端网络处理的线程类

 

每个此类对象,主要包含下面几个类:

1、ObjectProxyFactory类对象:在本类构造函数,会new一个ObjectProxyFactory,并与本类this指针绑定.参考上面Communicator部分的描述

2、TC_Epoller类对象:构造函数时,_ep.create(1024),创建epoll句柄,并给此epoll设置最大支持1024链接数。

3、TC_Socket类对象:一个socket,专用于 关闭线程请求的事件通知 .创建之后,立刻add进上面的epoll中

4、AsyncProcThread异步线程数组:异步线程数配在<asyncthread>字段中,默认是3个,最多只有1024个。

5、初始化MAX_CLIENT_NOTIFYEVENT_NUM = 2048个NotifyInfo请求事件通知数组

6、如果是<modulename>字段有配内容, 设置对应modulename的异步队列统计上报对象PropertyReport

7、一些关键的性能参数:

1]节点ip队列未发送请求的大小限制,<nosendqueuelimit>字段配置中,默认是1000,代码保护不小于1000.这个值,最终会在AdapterProxy的调用时用到,若队列满,会丢弃后续请求

2]异步队列大小,<asyncqueuecap>配置中,默认是10000,代码保护不小于10000.作为参数设置每个AsyncProcThread异步线程的队列大小。在异步线程中塞入异步队列时,队列满,丢弃后续请求

3] epollwait的超时时间,单位ms: <epollwaittimeout>配置中,默认是100,代码保护不小于1。与下面的检查超时请求间隔时间2选一,选小的那个,用于CommunicatorEpoll::run()中的_ep.wait(epollwaitouttime)此处,epoll循环超时。

4]检查超时请求的时间间隔,单位ms:<timeoutcheckinterval>配置中,默认是100,代码保护不小于1。用于CommunicatorEpoll::doTimeout()及CommunicatorEpoll::run()中处理超时的流程.会轮询_objectProxyFactory中所有 的ObjProxy,以及ObjProxy中绑定的AdapterProxy数组。

 

tars framework 源码解读(五) servant部分章节。客户端部分。客户端部分的一些类及其配置细节

标签:统计   int   data   参数设置   关闭   notify   and   时间间隔   enum   

原文地址:https://www.cnblogs.com/yylingyao/p/12198155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!