Nodejs下DNS緩存問題淺析
無意間看到一個(gè)文章,是關(guān)于nodejs下發(fā)送http請(qǐng)求不會(huì)緩存dns結(jié)果的。這意味著,如果你基于nodejs寫了一個(gè)http采集程序,不提供dns緩存則會(huì)讓每次請(qǐng)求都傻傻的重復(fù)解析域名為ip地址。聽起來會(huì)非常影響性能不是么?
我的項(xiàng)目中,發(fā)送http請(qǐng)求并不是使用的node原生的http庫(kù),而是依賴一個(gè)常用的Request庫(kù)。我查閱了一下該庫(kù)的相關(guān)文檔和github issue,也發(fā)現(xiàn)了一些和dns相關(guān)的帖子。不過多數(shù)說的是,關(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è)方案,看起來似乎都很簡(jiǎn)單,只是安裝并初始化即可。但問題是,我們?cè)趺磥眚?yàn)證它們真實(shí)有效?由于我本地的開發(fā)機(jī)操作系統(tǒng)環(huán)境是win7 64bit,所以上文提到的操作系統(tǒng)級(jí)別的方案我無法測(cè)試。那我們就來看一下應(yīng)用級(jí)別方案到底是否有效吧~~
首先,我們需要讓win能追蹤dns請(qǐng)求,這里我找到了一個(gè)軟件,下載后不需要安裝直接運(yùn)行即可。然后,我們還需要一個(gè)清除緩存的方法,可以看這里,簡(jiǎn)單說就是在終端中執(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)求,這說明什么?我的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,這說明什么?很明顯,我們的應(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)站的支持!
- node.js使用 http-proxy 創(chuàng)建代理服務(wù)器操作示例
- node.js使用http模塊創(chuàng)建服務(wù)器和客戶端完整示例
- javascript常用方法、屬性集合及NodeList 和 HTMLCollection 的瀏覽器差異
- Node.js中使用Log.io在瀏覽器中實(shí)時(shí)監(jiān)控日志(等同tail -f命令)
- nodejs讀取圖片返回給瀏覽器顯示
- node.js利用redis數(shù)據(jù)庫(kù)緩存數(shù)據(jù)的方法
- Nodejs基于LRU算法實(shí)現(xiàn)的緩存處理操作示例
- nodejs使用redis作為緩存介質(zhì)實(shí)現(xiàn)的封裝緩存類示例
- Node.js 實(shí)現(xiàn)簡(jiǎn)單的無侵入式緩存框架的方法
- node Buffer緩存區(qū)常見操作示例
- node.js實(shí)現(xiàn)http服務(wù)器與瀏覽器之間的內(nèi)容緩存操作示例
相關(guān)文章
Nodejs實(shí)現(xiàn)獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式詳解
這篇文章主要為大家詳細(xì)介紹了Nodejs前端獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題
這篇文章主要介紹了關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題,本文給大家分享解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10node創(chuàng)建Vue項(xiàng)目步驟詳解
在本篇文章里小編給大家整理的是關(guān)于node創(chuàng)建Vue項(xiàng)目步驟詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03使用Raygun對(duì)Node.js應(yīng)用進(jìn)行錯(cuò)誤處理的方法
這篇文章主要介紹了使用Raygun對(duì)Node.js應(yīng)用進(jìn)行錯(cuò)誤處理的方法,Node.js是一款用于服務(wù)器端的JavaScript框架,需要的朋友可以參考下2015-06-06node.js如何操作MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了node.js如何操作MySQL數(shù)據(jù)庫(kù),幫助大家更好的進(jìn)行web開發(fā),感興趣的朋友可以了解下2020-10-10