nodejs dns.lookup 很慢很慢

2016-12-06 23:30:28 +08:00
 yuyuyu
var http = require('http');
var url = require('url');
var dns = require('dns');
var qs = require('querystring');

dns.setServers(['223.5.5.5']);
var server = http.createServer(function (req, res) {
    var uri = url.parse(req.url);
    var h = qs.parse(uri.query).host;
    if (!h) {
	res.end();
        return;
    }
    if (uri.pathname === '/dnsQuery') {
        //console.log(h);
        dns.lookup(h, { family: 4, all: true }, function (err, addrs) {
            if (err) {
                console.error(h + ":" + err);
                res.end();
            }
            else {
                var result=addrs.map(r=>r.address).join(',');
                console.log(h+':'+result);
                res.setHeader('Cache-Control', 'public, max-age=3600');
                res.end(result);
            }
	});
    }
});
server.listen(8080);

很简单的一段代码,一开始还好,在并发量(也不多估计才几十到一百每秒)上来以后就查询的非常慢,前面挂的 nginx 60 秒后就 504 了,而且当我查询已经查询过的域名的时候也是 504 ,好像 nginx 的缓存没有生效一样,用 pm2 list 确认了 app 还在运行,并且 pm2 logs 里也有查询的记录

2149 次点击
所在节点    Node.js
4 条回复
zbinlin
2016-12-07 15:53:09 +08:00
你可以看下官方文档里关于 dns.lookup 的说明:
https://nodejs.org/dist/latest-v6.x/docs/api/dns.html#dns_dns_lookup
jacobbubu
2016-12-07 16:10:51 +08:00
dns.lookup 和 nginx 无关。 node.js 的 dns.lookup 实现是无缓存的,如果需要缓存自己来做。
mcree
2016-12-10 00:17:50 +08:00
不一定是这个原因,不过上游 DNS 服务器可能有 rate-limit 。
yunshansimon
2016-12-10 09:15:22 +08:00
使用 dns.resolve()代替 lookup()再试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325781

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX