池化
池化是一种资源复用计数,通过预先创建一组可复用的资源对象,避免频繁申请/释放带来的开销(如 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
| class CAsioIoServicePool : public Singleton<CAsioIoServicePool> { friend class Singleton<CAsioIoServicePool>; public: using IOService = boost::asio::io_context; using Work = boost::asio::executor_work_guard<boost::asio::io_context::executor_type>; ~CAsioIoServicePool(); 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
| 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_; };
|