dns.resolveCname 当有大量 CNAME 需要解析时失败
dns.resolveCname fails when there are large amounts of CNAMEs to be resolved
我正在编写一个程序来解析大约 10,000 个 CNAME。
我遇到的问题是,当要解析的 CNAME 数量太大时,会出现 dns.resolveCname()
returns Error: queryCname ESERVFAIL
错误。
代码如下所示:
const dns = require('dns')
dns.setServers(['8.8.8.8']) // provided by google
let cnames = [....] // length of cnames is 10,000
let promiseArr = []
for (let i = 0; i < cnames.length; i += 1) {
let p = new Promise((resolve, reject) => {
dns.resolveCname(cnames[i], (err, records) => {
if (err) {
console.log(err) // this line generates Error: queryCname ESERVFAIL
resolve() // sorry, I forgot adding this line.
} else {
console.log(records)
resolve() // sorry, I forgot adding this line.
}
})
})
promiseArr.push(p)
}
Promise.all(promiseArr)
.then(value => {
console.log(`Promise.all done`)
})
.catch(err => {
console.log(`promise err: ${err}`)
})
这是否意味着我不能太频繁地使用dns.resolveCname()
?
是否可以通过降低我触发的频率来避免这个问题dns.resolveCname()
?
或者还有其他方法可以解决这个问题吗?
我正在使用 node.js v6.2.2。
ESERVFAIL
- The application queries for api.example.com
, there is a SERVFAIL error thrown back and the call fails.
如果至少有一个异步函数抛出错误,Promise.all
将 catch
(停止执行)。所以你不能在这种情况下使用 Promise all,并且对于 10000 次异步调用这是一个不好的做法,你可以轻松地转储所有内存。
解决您的问题的一种方法是实施 parallel limited queue
来解决错误和结果,然后您就可以设法以正确的方式输出结果。
我发现实现有限队列的一个库是 cwait
From their documentation:
import * as Promise from 'bluebird';
import {TaskQueue} from 'cwait';
/** Queue allowing 3 concurrent function calls. */
var queue = new TaskQueue(Promise, 3);
Promise.map(list, download); // Download all listed files simultaneously.
Promise.map(list, queue.wrap(download))); // Download 3 files at a time.
我正在编写一个程序来解析大约 10,000 个 CNAME。
我遇到的问题是,当要解析的 CNAME 数量太大时,会出现 dns.resolveCname()
returns Error: queryCname ESERVFAIL
错误。
代码如下所示:
const dns = require('dns')
dns.setServers(['8.8.8.8']) // provided by google
let cnames = [....] // length of cnames is 10,000
let promiseArr = []
for (let i = 0; i < cnames.length; i += 1) {
let p = new Promise((resolve, reject) => {
dns.resolveCname(cnames[i], (err, records) => {
if (err) {
console.log(err) // this line generates Error: queryCname ESERVFAIL
resolve() // sorry, I forgot adding this line.
} else {
console.log(records)
resolve() // sorry, I forgot adding this line.
}
})
})
promiseArr.push(p)
}
Promise.all(promiseArr)
.then(value => {
console.log(`Promise.all done`)
})
.catch(err => {
console.log(`promise err: ${err}`)
})
这是否意味着我不能太频繁地使用dns.resolveCname()
?
是否可以通过降低我触发的频率来避免这个问题dns.resolveCname()
?
或者还有其他方法可以解决这个问题吗?
我正在使用 node.js v6.2.2。
如果至少有一个异步函数抛出错误,
ESERVFAIL
- The application queries forapi.example.com
, there is a SERVFAIL error thrown back and the call fails.
Promise.all
将 catch
(停止执行)。所以你不能在这种情况下使用 Promise all,并且对于 10000 次异步调用这是一个不好的做法,你可以轻松地转储所有内存。
解决您的问题的一种方法是实施 parallel limited queue
来解决错误和结果,然后您就可以设法以正确的方式输出结果。
我发现实现有限队列的一个库是 cwait
From their documentation:
import * as Promise from 'bluebird';
import {TaskQueue} from 'cwait';
/** Queue allowing 3 concurrent function calls. */
var queue = new TaskQueue(Promise, 3);
Promise.map(list, download); // Download all listed files simultaneously.
Promise.map(list, queue.wrap(download))); // Download 3 files at a time.