欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > > 编程问答 >内容正文

编程问答

双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现 -凯发k8官方网

发布时间:2025/1/21 编程问答 5 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最近开始看tair的源码实现,tair的通信使用的是淘宝的开源的网络库tbnet实现。具体来说是依靠tbnet::transport类型实现,其源代码路径如下:
http://code.taobao.org/svn/tb-common-utils/trunk/tbnet/src
下面介绍其通信流程:
1. 启动
transport::start()完成其启动,主要工作是启动了两个线程:_readwritethread和_timeoutthread. 这两个线程的实际入口函数式tranport::run(), 下面是transport::run的实现:

 

 

  • void transport::run(tbsys::cthread *thread, void *arg) {
  •     if (thread == &_timeoutthread) {
  •         timeoutloop();
  •     } else {
  •         eventloop((socketevent*)arg);
  •     }
  • }  
  •  

        a. 读写线程:
            1. 读写线程使用epoll实现,在transport中存在一个epollsocketevent _socketevent 成员变量, arg传入的是这个成员变量的指针,epollsocketevent是epoll个操作的封装,在epollsocketevent的构造函数中会调用epoll_create初始化epoll。
            2. eventloop的实现步骤如下:
                    a.  调用socketevent->getevents() 取得发生的事件并放入到ioevents数组中
                            i.  调用epoll_wait等待读写事件;
                            ii. 每个事件的events[i].data.ptr存放有事件对应的iocomonet(socket 封装),可以用来处理读写事件;
                    b.  对于读写事件,分别调用ioc->handlereadevent()和ioc->handlewriteevent()处理;
        
        b. timeout线程
            1. 主要用于检查通信的socket是否超过一定时常没有使用,对于tcpcomponent(封装通信socket),如果15分钟没有使用,则断开连接;

    2. 监听
    通过调用transport::listen()完成监听, 主要完成以下步骤:
        a.  创建tcpacceptor,继承于iocomonet(socket 封装),并启动异步监听;
        b. 调用addcomponent(acceptor, true, false);
                i.  创建epoll_event ev,设置ev.data.ptr = socket->getiocomponent(),用来处理读写事件的iocomponentsocket 封装)
                ii. 调用epoll_ctl(_iepfd,epoll_ctl_add,socket->getsockethandle(),&ev)注册监听socket上的读取事件;
        c. 当客户端有connect请求过来的时候会触发监听socket上的读取事件,tcpacceptor::handlereadevent()会被调用。

    3. 接受客户端的连接请求
    系统在tcpacceptor::handlereadevent()中接受客户端的连接请求,主要步骤如下:
        a. socket = ((serversocket*)_socket)->accept() 接受连接请求并得到通信socket;
        b. 创建tcpcomponent封装通信socket;
        c. 调用addcomponent(component, true, false) 注册当前socket的读取事件。

    4. 数据通信
        a. 数据读取
             数据通信由通信socket完成,该socket在epoll中注册,当有数据需要读取的时候会触发读取事件并调用tcpcomponent::handlereadevent()处理。
        b. 数据发送
             当有数据需要发送时connection::postpacket()函数, 这个函数中会调用_iocomponent->enablewrite(true),注册写入事件,并调用tcpcomponent::handlewriteevent()处理。

    转载于:https://www.cnblogs.com/ranran/p/taobao_tongxin.html

    与50位技术专家面对面20年技术见证,附赠技术全景图

    总结

    以上是凯发k8官方网为你收集整理的双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图