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实现黑名单中间件设计
Jun 17 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 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
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python脚本内运行linux命令的方法
2015/07/02 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python自动识别文本编码格式代码
2019/12/26 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
Python文件操作的面试题
2013/06/22 面试题
事业单位请假制度
2014/01/13 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
自主招生自荐信指南
2014/02/04 职场文书
护士的自我鉴定
2014/02/07 职场文书
演讲稿的写法
2014/05/19 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
初中历史教学反思
2016/02/19 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android