本文只适用于 node 0.10 版本,从 0.11 开始 globalAgent 默认句柄数不受限制。node
nodejs中对于http的request调用,默认会使用globalAgent,这个对象默认建立五个链接池。为了证实这个观点,首先编写以下测试代码:git
var testhttp = require('../testhttp'); var count = 0; for(var i= 0;i<1000;i++) { testhttp.getOriginal('http://www.baidu.com',function(err,body) { console.log(count++, err); }); }
代码1 test_get_baidu3_nowait.js
为了测试方便,专门修改了百度域名(wwww.baidu.com)的hosts定义,在操做系统的hosts文件中专门添加这么一行:服务器
61.135.169.125 www.baidu.com
固然这里的ip须要你本身先ping一下www.baidu.com,将其改成ping出来的域名,若是你不这么作的话,百度的cdn会不时的切换ip,由于咱们下边要用到wireshark,须要一个固定的ip。
接着打开wireshark,在捕获选项界面中填入:异步
host 61.135.169.125 and port 80
肯定以后,在主界面中填入过滤条件:tcp
tcp.flags.syn==1 && ip.src==192.168.1.3
由于这里只关心链接创建。点击应用,而后运行test_get_baidu3_nowait.js
.
会发现整个过程一共只有5次tcp握手请求(确切的说应该稍微会多余5次,由于当中要考虑到http服务器会强制断开tcp链接的状况,这个时候就逼迫客户端从新作tcp链接,因此说tcp链接请求可能要这么六、7次的样子)。
接下来问题来了,假设咱们在异步回调中再调用http请求,就会发现每一个请求都会创建tcp链接,下面是咱们的代码:测试
var testhttp = require('../testhttp'); var count = 0; for(var i= 0;i<1000;i++) { setTimeout(function() { testhttp.getOriginal('http://www.baidu.com',function(err,body) { console.log(count++, err); }); },100*i); }
代码2 test_get_baidu3.js
会发现链接创建的大概有10屡次,起初觉得是异步回掉时,自带的链接池有问题,后来仔细观察了一下仍是服务器端强制断开链接形成了,每次强制断开链接一次,客户端就会建立一个新的链接放到池子中去。
试着将setTimeout的时间间隔改成0,发现链接创建次数跟代码1相比差很少了。看来服务器端对于链接的活跃程序很敏感,稍微一超时就会被干掉。
项目中用到的代码,能够从http://git.oschina.net/yunnys... 获取。ui