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数组。