- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用 Node.js - 异步和请求模块来抓取 100+ 数百万个网站,几分钟后我不断遇到错误 ESOCKETTIMEDOUT
和 ETIMEDOUT
。
我重新启动脚本后它再次工作。这似乎不是连接限制问题,因为我仍然可以毫无延迟地执行 resolve4、resolveNs、resolveMx 和 curl
。
您是否发现代码有任何问题?或任何建议?我想将 async.queue() 的并发量提高到至少 1000。谢谢。
var request = require('request'),
async = require('async'),
mysql = require('mysql'),
dns = require('dns'),
url = require('url'),
cheerio = require('cheerio'),
iconv = require('iconv-lite'),
charset = require('charset'),
config = require('./spy.config'),
pool = mysql.createPool(config.db);
iconv.skipDecodeWarning = true;
var queue = async.queue(function (task, cb) {
dns.resolve4('www.' + task.domain, function (err, addresses) {
if (err) {
//
// Do something
//
setImmediate(function () {
cb()
});
} else {
request({
url: 'http://www.' + task.domain,
method: 'GET',
encoding: 'binary',
followRedirect: true,
pool: false,
pool: { maxSockets: 1000 },
timeout: 15000 // 15 sec
}, function (error, response, body) {
//console.info(task);
if (!error) {
// If ok, do something
} else {
// If not ok, do these
console.log(error);
// It keeps erroring here after few minutes, resolve4, resolveNs, resolveMx still work here.
// { [Error: ETIMEDOUT] code: 'ETIMEDOUT' }
// { [Error: ESOCKETTIMEDOUT] code: 'ESOCKETTIMEDOUT' }
var ns = [],
ip = [],
mx = [];
async.parallel([
function (callback) {
// Resolves the domain's name server records
dns.resolveNs(task.domain, function (err, addresses) {
if (!err) {
ns = addresses;
}
callback();
});
}, function (callback) {
// Resolves the domain's IPV4 addresses
dns.resolve4(task.domain, function (err, addresses) {
if (!err) {
ip = addresses;
}
callback();
});
}, function (callback) {
// Resolves the domain's MX records
dns.resolveMx(task.domain, function (err, addresses) {
if (!err) {
addresses.forEach(function (a) {
mx.push(a.exchange);
});
}
callback();
});
}
], function (err) {
if (err) return next(err);
// do something
});
}
setImmediate(function () {
cb()
});
});
}
});
}, 200);
// When the queue is emptied we want to check if we're done
queue.drain = function () {
setImmediate(function () {
checkDone()
});
};
function consoleLog(msg) {
//console.info(msg);
}
function checkDone() {
if (queue.length() == 0) {
setImmediate(function () {
crawlQueue()
});
} else {
console.log("checkDone() not zero");
}
}
function query(sql) {
pool.getConnection(function (err, connection) {
if (!err) {
//console.log(sql);
connection.query(sql, function (err, results) {
connection.release();
});
}
});
}
function crawlQueue() {
pool.getConnection(function (err, connection) {
if (!err) {
var sql = "SELECT * FROM domain last_update < (UNIX_TIMESTAMP() - 2592000) LIMIT 500";
connection.query(sql, function (err, results) {
if (!err) {
if (results.length) {
for (var i = 0, len = results.length; i < len; ++i) {
queue.push({"id": results[i]['id'], "domain": results[i]['domain'] });
}
} else {
process.exit();
}
connection.release();
} else {
connection.release();
setImmediate(function () {
crawlQueue()
});
}
});
} else {
setImmediate(function () {
crawlQueue()
});
}
});
}
setImmediate(function () {
crawlQueue()
});
而且系统限制相当高。
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 257645 257645 processes
Max open files 500000 500000 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 257645 257645 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
sysctl
net.ipv4.ip_local_port_range = 10000 61000
最佳答案
默认情况下,Node 有 4 workers to resolve DNS queries .如果您的 DNS 查询需要很长时间,请求将在 DNS 阶段阻塞,并且症状正是 ESOCKETTIMEDOUT
或 ETIMEDOUT
。
尝试增加你的 uv 线程池大小:
export UV_THREADPOOL_SIZE=128
node ...
或在 index.js
中(或任何你的入口点):
#!/usr/bin/env node
process.env.UV_THREADPOOL_SIZE = 128;
function main() {
...
}
编辑:I also wrote blog post关于它。
关于javascript - Node.js GET 请求 ETIMEDOUT & ESOCKETTIMEDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24320578/
我在使用 yarn 时遇到问题,但仅限于一台计算机。 当我运行yarn install时,某些软件包无法下载,并且出现此错误:ESOCKETTIMEDOUT: 起初我只是认为存储库存在一些问题,但是:
我正在使用 Macbook,当我尝试创建 React Native 应用程序时,它抛出 ESOCKETTIMEDOUT错误。 我试图清理 npm 和 yarn 缓存,但它没有帮助。 react-nat
我正在使用 request 抓取很多链接模块与 async 的组合并行模块。 我注意到很多 ETIMEDOUT 和 ESOCKETTIMEDOUT 错误,尽管链接可以访问并且使用 chrome 可以快
我是 Autodesk-Forge API 的新手,我正在尝试使用 node.js 中包含的示例 dmSample.js SDK。 该示例适用于非常小的文件(最多 500 Kb) 但是,当我尝试上传较
我将 Cloud Functions for Firebase 与 Firebase 实时数据库结合使用,以便为我的应用进行一些数据管理。 我的一个函数似乎被终止了,因为它需要大约 100-150 秒
我正在使用 Node.js - 异步和请求模块来抓取 100+ 数百万个网站,几分钟后我不断遇到错误 ESOCKETTIMEDOUT 和 ETIMEDOUT。 我重新启动脚本后它再次工作。这似乎不是连
我们在 docker 上运行的 Node API 在负载下会出现 ESOCKETTIMEDOUT 或 ECONNREFUSED 错误。当我们从 Node API 调用 .NET API 时,就会发生这
我在使用 npm request 包时遇到一些问题,无法正确调用任何 URL,除非该 URL 指向已关闭的服务器。例如,我无法调用 amazon.com,但可以调用 dev.personalDomai
在测试用例中运行超过 70-80 条测试线时,它会显示“socket hang up error”或“ESOCKETTIMEDOUT”。测试突然停止执行测试代码,假设 15-20 分钟后它给出了错误。
我是一名优秀的程序员,十分优秀!