国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

Nodejs下DNS緩存問題淺析

2019-11-19 18:57:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

無(wú)意間看到一個(gè)文章,是關(guān)于nodejs下發(fā)送http請(qǐng)求不會(huì)緩存dns結(jié)果的。這意味著,如果你基于nodejs寫了一個(gè)http采集程序,不提供dns緩存則會(huì)讓每次請(qǐng)求都傻傻的重復(fù)解析域名為ip地址。聽起來(lái)會(huì)非常影響性能不是么?

我的項(xiàng)目中,發(fā)送http請(qǐng)求并不是使用的node原生的http庫(kù),而是依賴一個(gè)常用的Request庫(kù)。我查閱了一下該庫(kù)的相關(guān)文檔和github issue,也發(fā)現(xiàn)了一些和dns相關(guān)的帖子。不過(guò)多數(shù)說(shuō)的是,關(guān)于dns問題,本身并不是Request庫(kù)的范疇,而歸結(jié)于nodejs的內(nèi)核問題。omg,感覺好深?yuàn)W啊!

幸好,上面提到的那篇文章中也提出了兩個(gè)解決方案:

應(yīng)用級(jí)別:dnscache

操作系統(tǒng)級(jí)別:Bind, dnsmasq 和 unbound

不論是哪個(gè)方案,看起來(lái)似乎都很簡(jiǎn)單,只是安裝并初始化即可。但問題是,我們?cè)趺磥?lái)驗(yàn)證它們真實(shí)有效?由于我本地的開發(fā)機(jī)操作系統(tǒng)環(huán)境是win7 64bit,所以上文提到的操作系統(tǒng)級(jí)別的方案我無(wú)法測(cè)試。那我們就來(lái)看一下應(yīng)用級(jí)別方案到底是否有效吧~~

首先,我們需要讓win能追蹤dns請(qǐng)求,這里我找到了一個(gè)軟件,下載后不需要安裝直接運(yùn)行即可。然后,我們還需要一個(gè)清除緩存的方法,可以看這里,簡(jiǎn)單說(shuō)就是在終端中執(zhí)行:

ipconfig /flushdns

工具就準(zhǔn)備完畢了,我們創(chuàng)建一個(gè)測(cè)試腳本:

const Request = require('request');function fetch(url, callback){Request.head({url: url,timeout: 10000,tunnel: true,gzip: true,proxy: false,followRedirect: false}, callback);}let now = Date.now();fetch('http://blog.kazaff.me', function(err, response, body){console.log('lookup time without cache: ', Date.now() - now);});

好的,現(xiàn)在打開DNSQuerySniffer,然后先清理一下本地DNS緩存,一切就緒后執(zhí)行我們的測(cè)試腳本node test.js。你會(huì)在DNSQuerySniffer中看到一次DNS請(qǐng)求及其相關(guān)信息。在一定的時(shí)間間隔內(nèi),反復(fù)運(yùn)行我們的測(cè)試腳本你會(huì)發(fā)現(xiàn)并不會(huì)再次觸發(fā)DNS請(qǐng)求,這說(shuō)明什么?我的win7環(huán)境本身就自帶操作系統(tǒng)級(jí)別的DNS緩存(只是緩存時(shí)間很短)。

修改我們的測(cè)試腳本如下:

const dnscache = require('dnscache')({"enable": true});const Request = require('request');function fetch(url, callback){Request.head({url: url,timeout: 10000,tunnel: true,gzip: true,proxy: false,followRedirect: false}, callback);}let now = Date.now();fetch('http://priceline.com', function(err, response, body){console.log('lookup time without cache: ', Date.now() - now);setTimeout(function(){now = Date.now();fetch('http://priceline.com', function(err, response, body){console.log('lookup time with cache: ', Date.now() - now);});}, 2000);});

這次我們?cè)趫?zhí)行測(cè)試腳本后,快速清空本地DNS緩存(如果你手速不快,可以適當(dāng)延長(zhǎng)setTimeout的觸發(fā)間隔),你會(huì)發(fā)現(xiàn),兩秒后的http請(qǐng)求并沒有重新查詢DNS,這說(shuō)明什么?很明顯,我們的應(yīng)用自己維護(hù)了DNS緩存,所以第二次請(qǐng)求根本就不會(huì)關(guān)心操作系統(tǒng)本地是否存在對(duì)應(yīng)的DNS緩存記錄。

以上所述是小編給大家介紹的Nodejs下DNS緩存問題,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳泉市| 酒泉市| 庆云县| 安宁市| 西昌市| 文水县| 海南省| 巴彦县| 潞城市| 连州市| 昭通市| 米脂县| 喀喇| 新龙县| 富顺县| 蕲春县| 西平县| 神农架林区| 临邑县| 多伦县| 双流县| 大丰市| 贞丰县| 孝义市| 长治市| 东丽区| 双城市| 察哈| 安多县| 巢湖市| 石嘴山市| 图们市| 姜堰市| 桃园市| 都匀市| 交口县| 昌邑市| 大足县| 水富县| 新源县| 新源县|