池化

池化

池化是一种资源复用计数,通过预先创建一组可复用的资源对象,避免频繁申请/释放带来的开销(如 TCP 连接建立、线程上下文切换、内存分配等),从而提升系统性能和稳定性。

一. 分配策略

特点:分配策略 + 无状态共享

核心设计:

  • 预先创建多个 io_context 对象(默认 2 个),每个运行在独立线程中。

  • 使用 轮询(Round-Robin)策略 分配 io_context 给新连接。

  • 每个 io_context 绑定一个 work guard,防止因无任务而退出。

  • 不涉及借还,分配后 socket 生命周期内独占该 io_context

Asio 连接池:

IOContextPool.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建 IOService 池子, acceptor 接收到连接以后取出一个 IOService 来创建 Http 管理(含通信套接字), 该 ioc 就负责通信套接字上的 IO 读写
class CAsioIoServicePool : public Singleton<CAsioIoServicePool> {
friend class Singleton<CAsioIoServicePool>;
public:
using IOService = boost::asio::io_context;
// 创建一个 work guard 来防止 io_context 因为没有任务而提前结束
using Work = boost::asio::executor_work_guard<boost::asio::io_context::executor_type>;
~CAsioIoServicePool();
// round-robin 策略: 分配策略
boost::asio::io_context& GetIOService();
void Stop();
private:
CAsioIoServicePool(size_t size = 2);
std::vector<IOService> m_IOServices;
std::vector<Work> m_Works;
std::vector<std::thread> m_Threads;
std::size_t _nextIOService;
};

二. 借还策略

特点:借还策略 + 有状态独占

核心设计:

  • 预先创建多个 VerifyService::Stub(每个 stub 内含一个 gRPC channel,即 TCP 连接)。

  • 线程通过 getConnection() 借出 一个 stub,使用完毕必须调用 pushConnection() 归还

  • 使用 std::mutex + std::condition_variable 保护连接队列,支持等待空闲连接。

  • 同一 stub 在被借出期间只能由一个线程使用(gRPC stub 非线程安全)。

grpc 连接池:

RPConPoo.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 借还策略:池化多个存根 stub 创建多个通信通道 channel 谁用就来取一个, 用完之后要还给池子
class RPConPool {
public:
RPConPool(size_t poolSize, std::string host, std::string port);
~RPConPool();
std::unique_ptr<VerifyService::Stub> getConnection();

void pushConnection(std::unique_ptr<VerifyService::Stub> context);

void Close();

private:
std::atomic<bool> m_stop_;
std::queue<std::unique_ptr<VerifyService::Stub>> m_conn_;
std::mutex m_mtx_;
std::condition_variable m_cond_;
size_t m_poolSize_;
std::string m_host_;
std::string m_port_;
};

redis 连接池:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class RedisConPool {
public:
RedisConPool(size_t poolSize, const char* host, int port, const char* pwd);
~RedisConPool();
redisContext* getConnection();
void returnConnection(redisContext* context);
void Close();
private:
// 连接元数据
const char* m_host_;
int m_port_;
size_t m_poolSize_;
// 连接池
std::mutex m_mtx_;
std::condition_variable m_cond_;
std::queue<redisContext*> m_conns_;
std::atomic<bool> m_stop_;
};

池化
https://dxblacksmith.github.io/2026/02/03/池化/
作者
DxBlackSmith
发布于
2026年2月3日
许可协议