httpAgent的maxSockets
如同服务器端的实现一般,http提供的ClientRequest对象也是基于TCP层实现的,在keepalive的情况下,一个底层会话连接可以多次用于请求。为了重用TCP连接,http模块包含一个默认的客户端代理对象http.globalAgent。它对每个服务器端(host + port)创建的连接进行了管理,默认情况下,通过ClientRequest对象对同一个服务器端发起的HTTP请求最多可以创建5个连接。
调用HTTP客户端同时对一个服务器发起10次HTTP请求时,其实质只有5个请求处于并发状态,后续的请求需要等待某个请求完成服务后才真正发出。这与浏览器对同一个域名有下载连接数的限制是相同的行为。 如果你在服务器端通过ClientRequest调用网络中的其他HTTP服务,记得关注代理对象对网络请求的限制。一旦请求量过大,连接限制将会限制服务性能。如需要改变,可以在options中传递agent选项。默认情况下,请求会采用全局的代理对象,默认连接数限制的为5。 我们既可以自行构造代理对象,代码如下: var agent = new http.Agent({ maxSockets: 10 }); var options = { hostname: '127.0.0.1’, port: 1334, path: '/’, method: 'GET’, agent: agent }; 也可以设置agent选项为false值,以脱离连接池的管理,使得请求不受并发的限制。 Agent对象的sockets和requests属性分别表示当前连接池中使用中的连接数和处于等待状态的请求数,在业务中监视这两个值有助于发现业务状态的繁忙程度。