nodejs下DNS缓存问题

无意间看到一个文章,是关于nodejs下发送http请求不会缓存dns结果的。这意味着,如果你基于nodejs写了一个http采集程序,不提供dns缓存则会让每次请求都傻傻的重复解析域名为ip地址。听起来会非常影响性能不是么?

我的项目中,发送http请求并不是使用的node原生的http库,而是依赖一个常用的Request库。我查阅了一下该库的相关文档和github issue,也发现了一些和dns相关的帖子。不过多数说的是,关于dns问题,本身并不是Request库的范畴,而归结于nodejs的内核问题。omg,感觉好深奥啊!

幸好,上面提到的那篇文章中也提出了两个解决方案:

不论是哪个方案,看起来似乎都很简单,只是安装并初始化即可。但问题是,我们怎么来验证它们真实有效?由于我本地的开发机操作系统环境是win7 64bit,所以上文提到的操作系统级别的方案我无法测试。那我们就来看一下应用级别方案到底是否有效吧~~

首先,我们需要让win能追踪dns请求,这里我找到了一个软件,下载后不需要安装直接运行即可。然后,我们还需要一个清除缓存的方法,可以看这里,简单说就是在终端中执行:

ipconfig /flushdns

工具就准备完毕了,我们创建一个测试脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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缓存(只是缓存时间很短)。

修改我们的测试脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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缓存记录。

SO,我们如果不想让自己的程序依赖操作系统环境,那现在就可以自己来维护DNS解析记录了,哇啦~

Javascript项目单元测试小结

这几天在写一个采集程序,用nodejs。老实讲这是第二次(相对正式)写和采集有关的模块,第一次是因为要定时访问自身项目来触发缓存的,细节可以看这里。后来从上一家公司离职,也没有继续维护这个程序了。
这次算是正宗的采集模块(确实是从目标网站中获取有价值的内容,我就不方便透露具体细节了~),而且这个项目是正式产品,不像之前公司那样扯~~这篇文章本身不是讲采集程序细节的,其实个人感觉开源的采集系统已经很成熟了,如果不是有特别特殊的需求,还是不要重复造轮子的好。

阅读全文

译-Sinon入门:利用Mocks,Spies和Stubs完成javascript测试

最近写完一个基于nodejs的组件后的我打算为其写一下单元测试,本以为之前了解过相当多的关于测试的知识,应该可以很顺利的搞定,可真的去写测试项的时候才发现依然存在一些需要克服的困难。不过,接下来翻译的这篇文章就是专门针对测试神器的,应该可以帮到和我一样的新手。

原文地址:https://www.sitepoint.com/sinon-tutorial-javascript-testing-mocks-spies-stubs/

阅读全文

一次被咨询后的感触

上周末陪着朋友去谈项目,刚好派单方是我以前的同事(好吧,其实我就是传说中的介绍人~)。一进办公室,对方的程序员就开始直奔主题,让我感到些许的不舒服。别误会,我十分喜欢开门见山直奔主题,但项目背景肯定是不能省的,直接进入具体功能细节真的让我感觉不适应。不过考虑到我只是个旁听,所以也就耐着性子听了一会~不一会老板来了,我就被拉出来私聊了。

阅读全文

十月份杂谈

Long time no write.

整整一个多月没有更新blog,原因有很多,但主要还是忙~

现在工作岗位偏重需求分析,我需要花大量的精力在与需求方一起讨论工作流程和系统的落地方案上。纯粹的技术性质的问题一般都会交给
其余同事负责跟进。所以一时不知道应该写什么在博客,毕竟之前博客都是偏向具体技术问题的主题。

阅读全文

如何基于接口文档生成模拟数据

前后端分离是目前主流的团队开发方式,有效的隔离不同技术领域开发人员的依赖,包括开发进度上的依赖和代码文件上的依赖。而做到这一点,全靠一个规则:依赖接口而不依赖实现。

那么,web领域前后端分离,通常都会选择基于http+json的方式,也就是大家说的restful类型的接口。在进入代码编写之前,团队会定义好所有依赖的rest接口,前后端开发人员遵照接口文档各自完成自己的工作,完美!

阅读全文

译-在多个标签页之间共享sessionStorage

原文:Sharing sessionStorage between tabs for secure multi-tab authentication

译者得er瑟


昨天,就在昨天,前端一同事提了一个问题:我们的系统,用户重新开一个标签页,就要重新登录。我当时觉得这怎么可能?结果现场一测,还真是,好尴尬!

今天抽了点时间网上查了查,才发现原来一直以为很简单的sessionStorage,还真埋了这么一颗雷。不过国外前辈也提出了一个解决方案,不仅如此,文章还把浏览器端保存数据的场景分析的很透彻,所以斗胆翻译了一下。

阅读全文

小团队玩不转的测试

早在上一家公司,就为测试问题头疼过,那时候测试全靠人肉,还整出了黑盒白盒测试文档,还要对代码进行打点,还要人工去匹配打点数据是否执行…都是泪,都是泪,都是泪啊!

那个时候团队人数最多时有十二个,项目现在想想也不算大,按道理是可以分出来一部分人来专做测试工作的,只是当时无法说服领导成立测试小组,毕竟自己也没有自动化测试的经验。最后强迫别的部门的同事来帮我们测,除了心不甘请不愿外,测试的结果也不是特别的理想。

换了一家公司,依然是四人小团队,现在我开始琢磨如何自动化测试了。毕竟之前的不愉快精力,再加上我现在的岗位更多是解决团队的开发效率问题,所以必须得正视这个头疼的问题。

阅读全文

Git Hook帮你维护前端代码规范

只要不是一个人在战斗,你都一定会碰到很多工程问题。我们今天来说的,就是代码格式问题。这不是个什么有意思的话题,这个话题讲的就是条条框框,就是枯燥,就是没意思。但是,如果你的团队缺少代码格式规范的话,当你review组员的代码时,你就会感觉在吃屎,没错,不夸张!

我不怀疑团队组员的积极性,因为条条框框本来就不是程序员的调调,而且人类和机器的最大差别就是遵守规范的程度。所以,你不能要求你口头上说代码格式要怎样怎么,所有同事就会立刻写出符合要求的完美代码。

阅读全文

Open-Falcon初探

随着项目的开发一点一点的完成,离初版上线日期已经越来越近了,这样就涉及到各种运维问题,监控的意义就体现出来了。虽然项目最终会部署在云平台,而云平台自身会带监控套件,不过不够灵活,一些想要的指标和报警方式还是需要自己来实现。大概看了几款监控解决方案,对Open-Falcon特别有好感,虽然我不懂GO语言~

阅读全文

传统Web项目代码变更引起的浏览器缓存问题和解决思路

不确定文章的标题描述的是否已经足够明了,至少用类似的描述在gg中并没有定位到相关的文章。讨论这个话题的更多是围绕这前端工程化套件的用法的(例如webpack、grunt、gulp等),而这些工具对单入口页面SPA应用支持度非常的好。但现实往往不尽如意,面对传统的多入口web项目,前端又应该如何解决浏览器缓存旧版本代码的问题呢?

阅读全文