我有数千个并发客户端线程,其中包含C10K 同步请求,在请求到来时新建tcp连接可能非常耗时,并且如果并发线程数增加,则无法进行扩展。
所以我认为共享连接(tcp)池对我来说可能是一个不错的选择,池中的所有连接(tcp)都被激活,所有请求共享池,需要发送消息时拉出,接收时推入消息完成。
但我怎么能实现呢?顺便说一句,我的服务器端符合多线程异步模式。
连接的部分代码(客户端):
class SyncTCPClient {
public:
SyncTCPClient(const std::string &raw_ip_address, unsigned short port_num) :
m_ep(asio::ip::address::from_string(raw_ip_address), port_num), m_sock(m_ios) {
m_sock.open(m_ep.protocol());
}
void connect() {
m_sock.connect(m_ep);
}
//...
private:
asio::io_service m_ios;
asio::ip::tcp::endpoint m_ep;
asio::ip::tcp::socket m_sock;
};
连接池的片段代码(客户端):
class ConnectionPool {
private:
std::queue<std::shared_ptr<SyncTCPClient>> pool;
std::mutex mtx;
std::condition_variable no_empty;
public:
ConnectionPool(int size) {
std::cout << "Constructor for connection pool." << std::endl;
for (int i = 0; i < size; i++) {
std::shared_ptr<SyncTCPClient> cliPtr = std::make_shared<SyncTCPClient>(raw_ip_address, port_num);
cliPtr->connect();
pool.push(cliPtr);
}
}
//...
};
连接接受的部分代码(服务器端):
std::shared_ptr<asio::ip::tcp::socket> sock = std::make_shared<asio::ip::tcp::socket>(m_ios);
m_acceptor.async_accept(*sock.get(),
[this, sock](const boost::system::error_code& error) {
onAccept(error, sock);
}
);
非常感谢 - )