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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
Python实现队列的方法
2015/05/26 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Django实现跨域请求过程详解
2019/07/25 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
Django如何重置migration的几种情景
2021/02/24 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
法律进学校实施方案
2014/03/15 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
党员个人承诺书
2015/04/27 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书