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入门详解(多篇文章结合)
Mar 07 NodeJs
Nodejs进程管理模块forever详解
Jun 01 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
详谈nodejs异步编程
Dec 04 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 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
客户端静态页面玩分页
2006/06/26 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
DOM 事件的深入浅出(一)
2016/12/05 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
如何利用python生成MD5并去重
2020/12/07 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
教师申诉制度
2014/01/29 职场文书
小学教师师德反思
2014/02/03 职场文书
警校毕业生自我评价
2014/04/06 职场文书
社区戒毒工作方案
2014/06/04 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
学生逃课检讨书
2015/02/17 职场文书
升职自我推荐信范文
2015/03/25 职场文书
2015党建工作简报
2015/07/21 职场文书
诚信教育主题班会
2015/08/13 职场文书