Node.js中的對象池

大家都知道用Node.js搭建一個簡單的http服務器是多么easy的事情庐橙,打開記事本貼幾句腳本命黔,ctrl+s一下澜沟,node server.js 一個http服務器就這樣跑起來了够坐,別看它簡單托嚣,但性能絲毫不差损趋。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

Node.js搭建的服務器性能如此給力確實讓我很好奇它的內(nèi)部是如何設計的患久,忍不住翻了翻lib下的代碼。

深入了解過Node.js http模塊的同學應該知道Node.js采用一個純c寫的http_parser來實現(xiàn)對http報文的解析浑槽,暴露到Node.js上的是一個HTTPParser對象蒋失,在Node.js中用下面一句代碼即可拿到

var HTTPParser = process.binding('http_parser').HTTPParser;

Node.js中調(diào)用c/c++內(nèi)置模塊采用 process.binding('module')模式,比如我們常用的setInterval和setTimeout都是基于c/c++代碼實現(xiàn)桐玻,用 process.binding('timer_wrap').Timer即可提供js調(diào)用篙挽。

Node.js http服務器每收到一個request就會用一個HTTPParser對象來解析出請求信息,比如請求參數(shù)镊靴,請求體之類的铣卡。如果說每接收一個request 都new 一個 HTTPParser對象來處理, 可以想象當并發(fā)達到成千上萬時創(chuàng)建HTTPParser對象是多么的頻繁,用完之后又立刻銷毀偏竟,這種場景我們很容易想到利用多線程來處理耗時任務煮落,為了避免頻繁的創(chuàng)建銷毀線程對象, 一般都會創(chuàng)建一個線程池來處理任務。于是Node.js中邊產(chǎn)生了對象池這么個東西,也就是接下來要講的freelist 踊谋。

首先我們來看看freelist是個什么東西蝉仇,和對象池有怎樣的聯(lián)系。

 function FreeList(name, max, constructor) {
  this.name = name;
  this.constructor = constructor;
  this.max = max;
  this.list = [];
};


FreeList.prototype.alloc = function() {
  return this.list.length ? this.list.shift() :
                            this.constructor.apply(this, arguments);
};


FreeList.prototype.free = function(obj) {
  //debug("free " + this.name + " " + this.list.length);
  if (this.list.length < this.max) {
    this.list.push(obj);
  }
};

代碼相當?shù)暮唵瓮首樱現(xiàn)reeList構(gòu)造函數(shù)接收3個參數(shù)量淌,對象池名字,大小以及對象構(gòu)造函數(shù)嫌褪。比如在Node.js中創(chuàng)建一個httpParse對象池:

var parsers = new FreeList('parsers', 1000, function() {
  var parser = new HTTPParser(HTTPParser.REQUEST);

  parser._headers = [];
  parser._url = '';
  parser[kOnHeaders] = parserOnHeaders;
  parser[kOnHeadersComplete] = parserOnHeadersComplete;
  parser[kOnBody] = parserOnBody;
  parser[kOnMessageComplete] = parserOnMessageComplete;

  return parser;
});

Node.js中用這段代碼創(chuàng)建了一個叫parsers,大小為1000的對象池呀枢,當Node.js服務器接收到一個request時便向這個對象池索取一個HTTPParser對象即調(diào)用對象池parsers的alloc方法,此時便拿到了一個parser對象笼痛,parser對象解析完http報文后node并沒有立即釋放它裙秋,而是將它重新放入對象池parsers中,即調(diào)用parsers.free(parser),當然了只有當池子還沒滿的時候才可以重新被放進去缨伊。如此便實現(xiàn)了parser對象的重復利用摘刑,當并發(fā)數(shù)很高時極大的提升性能。

Alt text
Alt text

相信小伙伴們應該都很清楚對象池的原理以及它在Node.js服務器中的作用了刻坊, 希望對大家在實際的業(yè)務中有所幫助哦~

參考文檔

1.https://github.com/joyent/node/tree/master/deps/http_parser
2.https://github.com/joyent/node/blob/master/lib/freelist.js

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枷恕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谭胚,更是在濱河造成了極大的恐慌徐块,老刑警劉巖未玻,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胡控,居然都是意外死亡扳剿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門昼激,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庇绽,“玉大人,你說我怎么就攤上這事橙困∏撇簦” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵纷宇,是天一觀的道長夸盟。 經(jīng)常有香客問我,道長像捶,這世上最難降的妖魔是什么上陕? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮拓春,結(jié)果婚禮上释簿,老公的妹妹穿的比我還像新娘。我一直安慰自己硼莽,他們只是感情好庶溶,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懂鸵,像睡著了一般偏螺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匆光,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天套像,我揣著相機與錄音,去河邊找鬼终息。 笑死夺巩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的周崭。 我是一名探鬼主播柳譬,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼续镇!你這毒婦竟也來了美澳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎人柿,沒想到半個月后柴墩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忙厌,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡凫岖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逢净。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哥放。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爹土,靈堂內(nèi)的尸體忽然破棺而出甥雕,到底是詐尸還是另有隱情,我是刑警寧澤胀茵,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布社露,位于F島的核電站,受9級特大地震影響琼娘,放射性物質(zhì)發(fā)生泄漏峭弟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一脱拼、第九天 我趴在偏房一處隱蔽的房頂上張望瞒瘸。 院中可真熱鬧,春花似錦熄浓、人聲如沸情臭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俯在。三九已至,卻和暖如春娃惯,著一層夾襖步出監(jiān)牢的瞬間跷乐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工石景, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劈猿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓潮孽,卻偏偏與公主長得像揪荣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子往史,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法仗颈,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法挨决,異常的語法请祖,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 上文“走進Node.js啟動過程”中我們算是成功入門了。既然Node.js的強項是處理網(wǎng)絡請求脖祈,那我們就來分析一個...
    滬江技術(shù)學院閱讀 3,400評論 0 15
  • 我做過孤單的事 一個人吃飯 一個人逛街 一個人看電影 一個人坐車 一個人去書店看書 買一個人的單 享受一個人的時光肆捕。
    dongseang閱讀 244評論 0 0
  • 【你聽過最能引起共鳴的話是什么?】照幽怪:關(guān)于孤獨 樓下一個男人病得要死盖高,那間壁的一家唱著留聲機慎陵,對面是弄孩子。樓...
    空歡喜大柯基閱讀 170評論 0 0
  • 投射最近出車順利喻奥。每天的客人爆滿席纽!一天可以賺500塊。宇宙爸爸完成我的心愿
    芬芳花盛開閱讀 138評論 0 0