Tars源码分析---TC_EpollServer

本文深入分析腾讯开源RPC框架Tars的TC_EpollServer组件,讲解其IO_ThreadPool、Handler_Pool和Adapter的设计。TC_EpollServer采用Epoll+Non-Blocking+多线程模型,Acceptor线程负责监听连接,IO线程处理网络事件。Adapter解析协议,作为IO线程和Handle之间的数据桥梁,而Handle处理具体业务逻辑。
摘要由CSDN通过智能技术生成

前言

这个系列的文章主要分析腾讯的开源RPC框架Tars。Tars除了提供RPC服务之外,还配套了一整套的运营管理平台。它同时支持C++,java等多种编程语言。本系列主要是分析tars的cpp部分实现,涉及的版本是github上最近release的1.40版。主要是在源代码层面进行分析,内容包括网络IO,服务路由等方面。本章将分析Tars上服务的网络IO所基于的TC_EpollServer组件。TC_EpollServer实现了底层的网络字符流接收,以及对外暴露Adapter和Handle接口,以实现插入式的协议解析,服务处理逻辑等等。因此,通过以TC_EpollServer为入口,我们可以粗粒度地对tars服务的实现框架进行了解。

架构


TC_EpollServer架构

如上图是TC_EpollServer的设计架构。它的由两种线程池构成:

  1. IO_Thread Pool
  2. Handler Pool
IO_Thread Pool

IO_thread pool负责处理网络事件,包括建立连接,网络数据传输等。它是基于经典的Epoll+Non-Blocking+多线程模型。线程池中的线程分为两种:Acceptor线程,负责监听TCP连接;以及监听有效数据传输的IO读写事件的线程。在目前的实现中,TC_EpollServer分配一个线程为acceptor,其余线程负责监听连接上的IO事件:

int  TC_EpollServer::bind(TC_EpollServer::BindAdapterPtr &lsPtr)
{
    int iRet = 0;

    for(size_t i = 0; i < _netThreads.size(); ++i)
    {
        if(i == 0)
        {
            iRet = _netThreads[i]->bind(lsPtr);
        }
        else
        {
            //当网络线程中listeners没有监听socket时,list使用adapter中设置的最大连接数作为初始化
            _netThreads[i]->setListSize(lsPtr->getMaxConns());
        }
    }

    return iRet;
}

当然,Accepto

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值