9.1.5 网络框架

OceanBase的网络框架代码如下:


class ObSingleServer

{

public:

//设置工作线程个数

int set_thread_count(const int thread_count);

//设置网络IO线程个数

int set_io_thread_count(const int io_thread_count);

//设置监听端口

int set_listen_port(const int listen_port);

public:

//处理接收到的网络包,默认的处理逻辑是将网络包加入到全局任务队列中

virtual int handlePacket(ObPacket*packet);

//工作线程每次从全局任务队列中取出一个网络包并调用该函数进行处理

virtual do_request(ObPacket*packet);

};


OceanBase服务端接收客户端发送的网络包(ObPacket),并交给handlePacket处理函数进行处理。默认情况下,handlePacket会将网络包加入到全局任务队列中。接着,工作线程会从全局任务队列中不断获取网络包,并调用do_request进行处理,处理完成后应答客户端。可以分别通过set_thread_count以及set_io_thread_count函数来设置工作线程以及网络线程的个数。

客户端使用ObClientManager发送网络包:


class ObClientManager

{

public:

//异步发送请求包

//@param[in]server服务器端地址

//@param[in]pcode请求包的类型(packet code)

//@param[in]version请求包的版本

//@param[in]in_buffer请求包实际内容缓冲区

int post_request(const ObServer&server,const int32_t pcode,const int32_t version,const ObDataBuffer&in_buffer)const;

//同步发送请求包并等待应答

//@param[in]server服务器端地址

//@param[in]pcode请求包的类型(packet code)

//@param[in]version请求包的版本

//@param[in]timeout请求时间

//@param[in]in_buffer请求包实际内容缓冲区

//@param[out]out_buffer应答包的实际内容缓冲区

int send_request(const ObServer&server,const int32_t pcode,const int32_t version,const int64_t timeout,ObDataBuffer&in_buffer,ObDataBuffer&out_buffer)const;

};


客户端发包分为两种情况:异步请求(post_request)以及同步请求(send_request)。异步请求时,客户端将请求包加入到网络发送队列后立即返回,不等待应答。同步请求时,客户端将请求包加入到网络发送队列后开始阻塞等待,直到网络线程接收到服务端的应答包后才唤醒客户端,从而执行后续处理逻辑。