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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 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中的观察者模式
2010/03/24 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP微商城开源代码实例
2019/03/27 PHP
json简单介绍
2008/06/10 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python实现机器学习之元线性回归
2018/09/06 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
详解python持久化文件读写
2019/04/06 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python处理RSTP视频流过程解析
2020/01/11 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
高一学生评语大全
2014/04/25 职场文书
音乐节策划方案
2014/06/09 职场文书
停课通知书
2015/04/24 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python