tair源码分析
Tair源码分析网易-忻丁峰编译连接运行:Svn checkout /svn/tb-common-utils/trunkSvn checkout /svn/tair/trunk编译tbsys和tbnetExport TBLIB_ROOT=XXXXX./build.sh编译tair./bootstrap.sh./configure --prefix=XXXXX --with-release=yesMakeMake install运行:调试:由于tair_server是fork子进程执行初始化服务的,而通过gdb executefile,然后run,只能跟踪父进程代码,那怎么跟踪到子进程代码呢?可以通过设置set follow-fork-mode child来调试子进程系统架构模块TbnetEPollSocketEvent:注册/移除网络事件,同时获取网络事件。通过epoll_event中的data.ptr来指向该事件对应的IOComponentTcpAcceptor:处理监听端口的读请求,获取新连接组装成TCPComponent并add给tranport。TcpAcceptor是继承于IOComponent。ChannelPool:管理所有的Channel,包括正在使用的channel和空闲的channelChannel:主要用于设置网络包对应的处理handler。典型用法是连接在发送packet时生成Channel,该channel包含channelID,packetHandler,ExpireTime等,等读取响应包后根据解析包头得到channelID去channelPool查找对应的Channel,然后由channel中的packetHandler处理响应packet,如果未设置packetHandler则采用默认的defaultPacketHandlerTransPort:对应传输层,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:eventLoop只有一个线程去轮询所有的注册事件,获取到读事件,该线程会读取对应socket上的数据,然后处理数据。那么如果系统请求量比较大的话,eventLoop只有一个线程需要处理所有的读数据和处理数据,这会不会成为系统的瓶颈?答:tair系统的用法是在处理包函数中并不包含逻辑处理,而是交给PacketQueueThread进行多线程处理数据包疑问点: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中的数据报写入socketConnectionManager:用于管理所有