Nodejs下DNS缓存问题浅析


Posted in NodeJs onNovember 16, 2016

无意间看到一个文章,是关于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缓存问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
在nodejs中创建child process的方法
Jan 26 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 #NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 #NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 #NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 #NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 #NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 #NodeJs
NodeJS使用formidable实现文件上传
Oct 27 #NodeJs
You might like
第五节 克隆 [5]
2006/10/09 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
vue 获取视频时长的实例代码
2019/08/20 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
python中对list去重的多种方法
2014/09/18 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python的UTC时间转换讲解
2019/02/26 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python dict乱码如何解决
2020/06/07 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
三关爱志愿服务活动方案
2014/08/17 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
经理岗位职责
2015/02/02 职场文书
手机销售员岗位职责
2015/04/11 职场文书
党委工作总结2015
2015/04/27 职场文书
python开发人人对战的五子棋小游戏
2022/05/02 Python