淘宝tair网络处理机制

淘宝tair网络处理机制_第1张图片

Tbnet 
EPollSocketEvent:注册/移除网络事件,同时获取网络事件。通过
epoll_event中的
data.ptr来指向该事件对应的IOComponent  
TcpAcceptor:处理监听端口的读请求,获取新连接组装成
TCPComponent并add给
tranport。TcpAcceptor是继承于IOComponent。  
ChannelPool:管理所有的Channel,包括正在使用的channel和空闲的channel 
 
Channel:主要用于设置网络包对应的处理
handler。典型用法是连接在发送packet时生
成Channel,该channel包含channelID,packetHandler,ExpireTime等,等读取响应包后根据解析包头得到channelID去channelPool查找对应的Channel,然后由channel中的

packetHandler处理响应packet,如果未设置packetHandler则采用默认的defaultPacketHandler  
TransPort:对应传输层,EPollSocketEvent用于读写socket网络事件,包含读写处理线程
和超时检查线程。listen接口中传入的IPacketStreamer用于packet的创建,组包和解包,IServerAdapter用于服务端处理客户端请求包。Connection用于连接serverid,并将新的socket网络事件添加到EPollSocketEvent。EventLoop用于处理读写,如果发现error的连接或者对方关闭连接,通过removeComponent来注销对应的网络事件,同时将对应的component加入del链表中。TimeoutLoop用于检测所有连接是否超时,同时将del链表中的component移除。无论是服务端还是客户端,都采用EventLoop(IO复用模型)和TimeoutLoop。 
checkTimeout的具体流程是检测IOComponent是否超时,如果超时,那么将socket进行shutdown(rw),此时发生4次握手协议,对方socket也会发finish包给本端,本端因为已经关闭了读一半,所以会触发read返回值为0,此时会调用removeComponent。 QA: 
1. eventLoop只有一个线程去轮询所有的注册事件,获取到读事件,该线程会读取对应
socket上的数据,然后处理数据。那么如果系统请求量比较大的话,eventLoop只有一个线程需要处理所有的读数据和处理数据,这会不会成为系统的瓶颈? 
答:tair系统的用法是在处理包函数中并不包含逻辑处理,而是交给PacketQueueThread进行多线程处理数据包  
疑问点: 
1. eventLoop和timeoutLoop有可能会同时操作同一个socket,这个怎样来保证socket线程
安全(read/write和shutdown可能会同时进行)?  
IOComponent/TCPComponent:包含一个连接的组件,主要用于处理读写事件和设
置对应连接的属性。继承类TCPComponent中含有一个Connection成员,而Connection可以用来处理socket读写  
Connection/TCPConnection:对应一个连接,主要用于执行真正的读写包,同时读
包后需要调用处理包逻辑,服务端连接调用IServerAdapter中的handlePacket/handleBatchPacket接口,客户端通过packet中的channelId查找对应的channel中的packHandler来处理网络包。发送包都是通过调用Connection中postPacket方法来实现的,该方法将要发送的packet放入outputQueue中,然后等Transport处理写事件时将outPutQueue中的数据报写入socket  
ConnectionManager:用于管理所有的客户端连接服务端的
connection,用
connectionMap维护了一个连接池 

你可能感兴趣的:(c++,tair,算法/数据结构)