使用NodeJS的异步DNS查找

时间:2017-11-16 16:30:59

标签: node.js dns

我正在尝试在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秒不等。

1 个答案:

答案 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()

我立即开始获得实际看起来异步的结果。 (结果开始实际上以不同的顺序返回,而不是从查找开始)