我正在尝试在NodeJS中编写脚本以异步执行许多DNS查找(以检查IP地址上的黑名单)
这是我目前的尝试:
const dns = require('dns');
RBLs = [
'b.barracudacentral.org',
'cbl.abuseat.org',
'http.dnsbl.sorbs.net',
'misc.dnsbl.sorbs.net',
'socks.dnsbl.sorbs.net',
'web.dnsbl.sorbs.net',
];
var testIP = "IP.ADDRESS";
console.time("exetime");
var RBLResults = {};
var RBLCallback = function(err, result, RBL){
if(typeof result !== "undefined" && result.length > 0){
console.log("LISTED on " + RBL);
}else{
console.log(" Not listed on " + RBL);
}
};
RBLs.forEach(function(RBL){
dns.lookup(testIP + '.' + RBL, function(err, result){
RBLCallback(err,result,RBL);
});
});
据我了解,这应该异步启动所有DNS查找。但是,列表越长,DNS请求不会同时发生就越清楚。 (我试图一次检查106个黑名单。)
我是否可以同时使用多少次DNS查找?结果的顺序几乎从不改变,所以看起来它们不是异步发生的。列表中的最后一个比第一个要长得多。
完成所需的时间实际上是可变的,从10秒到100秒不等。
答案 0 :(得分:0)
我在dns
的nodeJS文档中找到了我的问题:
虽然对dns.lookup()的调用与JavaScript不同 透视,它被实现为对getaddrinfo的同步调用(3) 在libuv的线程池上运行。这可能有令人惊讶的负面影响 对某些应用程序的性能影响,请参阅 有关更多信息,请参阅UV_THREADPOOL_SIZE文档。
https://nodejs.org/docs/latest/api/dns.html#dns_implementation_considerations
所以从Javascript方面看,它看起来确实是异步工作,但实际上并非如此。
为了让DNS查找以异步方式发生,我只是将dns.lookup
替换为dns.resolve()
。
我立即开始获得实际看起来异步的结果。 (结果开始实际上以不同的顺序返回,而不是从查找开始)