时间:2021-05-26
无意间看到一个文章,是关于nodejs下发送http请求不会缓存dns结果的。这意味着,如果你基于nodejs写了一个http采集程序,不提供dns缓存则会让每次请求都傻傻的重复解析域名为ip地址。听起来会非常影响性能不是么?
我的项目中,发送http请求并不是使用的node原生的http库,而是依赖一个常用的Request库。我查阅了一下该库的相关文档和github issue,也发现了一些和dns相关的帖子。不过多数说的是,关于dns问题,本身并不是Request库的范畴,而归结于nodejs的内核问题。omg,感觉好深奥啊!
幸好,上面提到的那篇文章中也提出了两个解决方案:
应用级别:dnscache
操作系统级别:Bind, dnsmasq 和 unbound
不论是哪个方案,看起来似乎都很简单,只是安装并初始化即可。但问题是,我们怎么来验证它们真实有效?由于我本地的开发机操作系统环境是win7 64bit,所以上文提到的操作系统级别的方案我无法测试。那我们就来看一下应用级别方案到底是否有效吧~~
首先,我们需要让win能追踪dns请求,这里我找到了一个软件,下载后不需要安装直接运行即可。然后,我们还需要一个清除缓存的方法,可以看这里,简单说就是在终端中执行:
ipconfig /flushdns工具就准备完毕了,我们创建一个测试脚本:
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);});好的,现在打开DNSQuerySniffer,然后先清理一下本地DNS缓存,一切就绪后执行我们的测试脚本node test.js。你会在DNSQuerySniffer中看到一次DNS请求及其相关信息。在一定的时间间隔内,反复运行我们的测试脚本你会发现并不会再次触发DNS请求,这说明什么?我的win7环境本身就自带操作系统级别的DNS缓存(只是缓存时间很短)。
修改我们的测试脚本如下:
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);});这次我们在执行测试脚本后,快速清空本地DNS缓存(如果你手速不快,可以适当延长setTimeout的触发间隔),你会发现,两秒后的http请求并没有重新查询DNS,这说明什么?很明显,我们的应用自己维护了DNS缓存,所以第二次请求根本就不会关心操作系统本地是否存在对应的DNS缓存记录。
以上所述是小编给大家介绍的Nodejs下DNS缓存问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
DNS缓存如果不及时清理,可能会导致网站打不开、上不了网等问题,那么Linux下要如何刷新DNS缓存呢?下面小编就给大家介绍下Ubuntu刷新DNS缓存的步
dns缓存,不过最近有位win7系统用户想要清理dns缓存,却发现dns缓存无法清理了,用户们不知道怎么回事,为此非常苦恼,那么win7电脑无法清除dns缓存如
刷新dns缓存的命令是什么?这是因为当我们需要安装新的软件的时候就需要先刷新下dns服务器,清除dns缓存。比如域名更改过需要重新解析新的域名,这样虽然DNS服
dns缓存,不过最近有位win7系统用户想要清理dns缓存,却发现dns缓存无法清理了,用户们不知道怎么回事,为此非常苦恼,那么win7电脑无法清除dns缓存如
今天在Ubuntu下给一个网站更换了DNS,试着重新连接,发现无法打开,只好ping一下做一个测试,发现ip还是原来的地址,显然是本地DNS缓存的问题。大家都知