OceanBase的网络框架代码如下:
class ObSingleServer
{
public:
//设置工作线程个数
int set_thread_count(const int thread_count);
//设置网络I/O线程个数
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_requst进行处理,处理完成后应答客户端。可以分别通过set_tread_count以及set_io_thread_count函数来设置工作线程以及网络线程的个数。
客户端使用ObCilentManager发送网络包:
class ObCilentManager
{
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 post_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)。异步请求时,客户端将请求包加入到网络发送队列后立即返回,不等待应答。同步请求是,客户端将请求包加入到网络发送队列后开始阻塞等待,直到网络线程接收到服务端的应答包后才唤醒客户端,从而执行后续处理逻辑。