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


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

  • 相关阅读:
    Codeforces Round #547 F1&F2. Same Sum Blocks(贪心)
    Codeforces Round #547 D. Colored Boots(贪心)
    Codeforces Round #547 C. Polycarp Restores Permutation(二分枚举/数学+模拟)
    CCF 201812-4 数据中心(最小生成树)
    CCF【小明放学&小明上学】
    TIME_WAIT状态
    ping的详细过程
    两段不相邻子段和之和最大
    神水一题之“Who's in the Middle”
    日进一步之“A Knight's Journey”
  • 原文地址:https://www.cnblogs.com/yylingyao/p/12198155.html
Copyright © 2020-2023  润新知