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服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
Nodejs让异步变成同步的方法
Mar 02 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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/07/13 国漫
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
php数组查找函数总结
2014/11/18 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
黄河的主人教学反思
2014/02/07 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
法院授权委托书范文
2014/08/02 职场文书
关于保护环境的建议书
2014/08/26 职场文书
材料员岗位职责
2015/02/10 职场文书
新课程改革心得体会
2016/01/22 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS