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 Express框架中处理404页面一个方式
May 28 NodeJs
使用forever管理nodejs应用教程
Jun 03 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
nodejs npm package.json中文文档
Sep 04 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP学习 变量使用总结
2011/03/24 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
解析Python中的异常处理
2015/04/28 Python
python类和函数中使用静态变量的方法
2015/05/09 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
使用python实现tcp自动重连
2017/07/02 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
Structs界面控制层技术
2013/10/11 面试题
大学生评语大全
2014/04/18 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL