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中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 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
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
用Python读取几十万行文本数据
2018/12/24 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
与UNIX有关的几个名词
2015/09/17 面试题
4s店机修工岗位职责
2013/12/20 职场文书
《手指教学》反思
2014/02/14 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫