如何使用Boost asio实现连接池?

时间:2017-11-15 04:58:58

标签: c++11 concurrency boost-asio connection-pooling

我有数千个并发客户端线程,其中包含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);
                          }
  );

非常感谢 - )

0 个答案:

没有答案