nodejs中http鏈接池複用的問題

本文只適用於 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

wireshark捕獲選項
肯定以後,在主界面中填入過濾條件: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

相關文章
相關標籤/搜索