最近开始看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的实现:

    1. void Transport::run(tbsys::CThread *thread, void *arg) {
    2. if (thread == &_timeoutThread) {
    3. timeoutLoop();
    4. } else {
    5. eventLoop((SocketEvent*)arg);
    6. }
    7. }

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()处理。

双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现的更多相关文章

  1. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  2. Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)

    一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变                                         ...

  3. 动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析

    移动智能设备的快速普及,给生活带来巨大的精彩,但是智能设备上用户的信息数据很多,隐私数据也非常多,各种各样的app可能通过各种方式在悄悄的收集用户数据,而用户的隐私就变得耐人寻味了.比如之前的可以无限 ...

  4. 双11不再孤单,结识ECharts---强大的常用图表库

    又是一年双十一,广大单身狗们有没有很寂寞(好把,其实我也是)!但是这次的双十一,我不再孤单,因为结识了一个js的强大的图表库---ECharts. 最近做软件工程项目的时候,由于设计图中有柱状图和饼图 ...

  5. WordPress使用淘宝IP地址库的API显示评论者的位置信息(二)

    1 淘宝IP地址库的接口说明 在上一篇文章<WordPress使用淘宝IP地址库的API显示评论者的位置信息(一)>中,vfhky使用了新浪工具提供的这个IP接口显示博客评论者的位置信息. ...

  6. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

    关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  7. 最强CP!阿里云联手支付宝小程序如何助力双11?

    作为首次“全面上云”的双11,阿里云征服了每秒订单峰值54.4万笔的世界新记录.正是在阿里云的保驾护航下,即使访问量是平时的5到6倍,小程序也鲜少出现卡顿或者宕机的现象,“依靠阿里云,我们整个天猫双1 ...

  8. 第八章 交互技术,8.4 Weex 双11会场大规模应用的秒开实战和稳定性保障(作者:鬼道)

    8.4 Weex 双11会场大规模应用的秒开实战和稳定性保障 前言 Native 开发的诸多亮点中,流畅体验和系统调用是最多被提及的.流畅体验体现在页面滚动/动画的流畅性,背后是更好的内存管理和更接近 ...

  9. 双11遇上ZBrushCore,如此优惠还等什么!

    对不起!让大家久等了,ZBrush简体中文版ZBrushCore这次是真的来了,恰逢双11,老板说了,钱不是问题,你们开心就好,特别是热爱3D的单身狗们!你们那么热爱这个行业,1099元/套终身授权使 ...

随机推荐

  1. flex 布局能解决的问题

    flex 布局,可以解决元素在容器中的对齐.方向.顺序,甚至它们是动态的或者不确定大小的新布局模型.Flex容器的主要特征是能够调整其子元素在不同的屏幕大小中能够用最适合的方法填充合适的空间 . 转载 ...

  2. OpenGL三维与光照

    #include<windows.h> #include<gl/glut.h> #include<gl/gl.h> #include<gl/glu.h> ...

  3. Internet History, Technology and Security (Week 5-1)

    Week 5 Technology: Internets and Packets Welcome to Week 5! This week, we'll be covering internets a ...

  4. PAT 甲级 1126 Eulerian Path

    https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152 In graph theory, an Eu ...

  5. ubuntu下安装vsftpd及vsftpd配置文件不见的解决办法

    利用命令 sudo apt-get install vsftpd   //安装 进入etc文件可以找到 vsftpd.conf的配置文件 作为新手难免会弄错配置又不知道怎么办,那么可能会利用 sudo ...

  6. IPV6 简单总结

    1. 转帖别人的内容 来源:https://www.2cto.com/net/201112/114937.html 2. 本地用IPV6单播地址 (包括链路本地单播地址 和 站点本地单播地址) 2.1 ...

  7. 微信小程序 功能函数 把数字1,2,3,4换成春,夏,秋,冬

    let season =‘1,2,3’; // console.log(season.length) if (season){ if (season.length==1){ seasonChe1=se ...

  8. NLP & 中文分词

    NLP & 中文分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 中文自然语言处理系统 https://www.ltp-cloud.com/int ...

  9. 计算机网络【4】—— TCP和UDP的区别

    一.TCP/UDP优点和缺点 TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认.窗口.重传.拥塞控制机制,在数据传完后,还会断开连接 ...

  10. Intelligent Factorial Factorization LightOJ - 1035(水题)

    就是暴力嘛...很水的一个题... 不好意思交都... #include <iostream> #include <cstdio> #include <sstream&g ...