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 win7下安装方法
May 24 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
NodeJs搭建本地服务器之使用手机访问的实例讲解
May 12 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
PHP实现分页的一个示例
2006/10/09 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
js单例模式的两种方案
2013/10/22 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
详解vue表单——小白速看
2018/04/08 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
python字符串中的单双引
2017/02/16 Python
python 调用c语言函数的方法
2017/09/29 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
学生档案自我鉴定
2013/10/07 职场文书
求职自荐信格式
2013/12/04 职场文书
读书活动总结
2014/04/28 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
初中生活随笔
2015/08/15 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server