前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >腾讯开源框架TarsCpp-rpc设计分析-client(二)

腾讯开源框架TarsCpp-rpc设计分析-client(二)

原创
作者头像
路小饭
修改2019-06-11 10:29:25
修改2019-06-11 10:29:25
1.4K0
举报

3 ObjectProxy概要设计

设置解析协议、选择服务端节点、建立连接、管理连接,如何发送请求、接收结果,这些细节都封装在了ObjectProxy中。

先说明ObjectProxy包含的主要组件,然后介绍组件间的调用关系。

3.1 主要组件说明

图1
图1
  1. ObjectProxy包含两个组件:ProxyProtocol用来设置解析协议,包括如何序列化请求和反序列化结果;EndpointManager是路由管理器,封装细节
  2. EndpointManager包含两个组件:路由策略,提供不同的服务器节点选择方式;AdapterProxy是具体节点代理,继续封装细节
  3. AdapterProxy中,Transceiver提供tcp和udp协议封装;checkActive负责节点状态管理,例如本节点是否有效,是否已经连接等等;TC_TimeoutQueueNew是一个超时队列,用来管理请求数量和超时
  4. 图1中的粉色框是invoke方法,是AdapterProxy和ObjectProxy的对外接口

3.1.1 Transceiver

Transceiver才是“真正”干活的哥们。最基础的系统操作如::send和::readv都是在这里被封装的。设计Transceiver时候考虑的要素如图2。

图2
图2
  1. connect环节需要注意的是连接状态和连接超时时间。
  2. 发送和接收环节需要注意设计高效缓存
  3. 注意设置套接字fd的相关属性,如TCP_NODELAY、SO_KEEPALIVE,使用fcntl设置非阻塞

3.2 组件关系说明

代码语言:txt
复制
void ObjectProxy::invoke(ReqMessage * msg)
{
    //选择一个远程服务的Adapter来调用
    AdapterProxy * pAdapterProxy = NULL;
    //EndpointManager* _endpointManger
    //selectAdapterProxy是封装的节点选择策略
    bool bFirst = _endpointManger->selectAdapterProxy(msg, pAdapterProxy);
    pAdapterProxy->invoke(msg);
}
  • 上面是精简后的ObjectProxy::invoke方法,比较清晰的展示了ObjectProxy、AdapterProxy 、EndpointManager三者之间的关系

下面继续用精简后的代码说明AdapterProxy 内部组件关系

代码语言:txt
复制
int AdapterProxy::invoke(ReqMessage * msg)
{
    //TC_TimeoutQueueNew* _timeoutQueue
    //未发链表有长度限制,如果请求队列满了,就不发到server端了
    if(_timeoutQueue->getSendListSize() >= _noSendQueueLimit)
    {
        finishInvoke(msg);
        return 0;
    }

    //对应的是图1中的ProxyProtocol
    _objectProxy->getProxyProtocol().requestFunc(msg->request, msg->sReqData);

    //交给连接发送数据,连接连上,buffer不为空,直接发送数据成功
    //Transceiver* _trans
    if(_timeoutQueue->sendListEmpty() && _trans->sendRequest(msg->sReqData.c_str(),msg->sReqData.size()) != Transceiver::eRetError)
    {
    }

    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3 ObjectProxy概要设计
    • 3.1 主要组件说明
      • 3.1.1 Transceiver
    • 3.2 组件关系说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档