Решения для исправления библиотеки https для node.js при одновременной отправке большого количества запросов
В настоящее время я работаю с проектом, что огромное количество запросов https (~15K~20K в секунду) должно быть отправлено через сервер node.js (узел v4.2.6). Общую структуру кода можно увидеть в конце этого поста.
Мы попытались отправить примерно 10~20 запросов https в секунду, и все они выполняются успешно, то есть не должно быть проблем с заголовком запроса и самим телом.
Однако возникают проблемы, когда мы начинаем масштабировать сервер Nodejs для отправки тысяч и миллионов запросов в секунду. В этом случае, похоже, что ответы на запросы не будут возвращаться никогда, вместо этого сервер Nodejs отключит сокет и выдаст следующие исключения:
{ [Error: socket hang up] code: 'ECONNRESET' }
Fri, 24 Feb 2017 06:08:39 GMT Caught exception: Error: socket hang up Details: {"code":"ECONNRESET"} Stack: Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at TLSSocket.socketOnEnd (_http_client.js:287:23)
at emitNone (events.js:72:20)
at TLSSocket.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:905:12)
at nextTickCallbackWith2Args (node.js:441:9)
at process._tickCallback (node.js:355:17)
{ [Error: socket hang up] code: 'ECONNRESET' }
Fri, 24 Feb 2017 06:08:39 GMT Caught exception: Error: socket hang up Details: {"code":"ECONNRESET"} Stack: Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at TLSSocket.socketCloseListener (_http_client.js:234:23)
at emitOne (events.js:82:20)
at TLSSocket.emit (events.js:169:7)
at TCP._onclose (net.js:469:12)
Мы чувствовали, что проблема вызвана тем, что библиотека https сама по себе автоматически отключит сокет, если будет отправлено слишком много запросов! Поэтому мне интересно, есть ли исправленная версия этой библиотеки https? или есть какая-нибудь альтернативная библиотека https post/get?? Любые предложения приветствуются!:-)
var https = require("https");
// do something
option_1.agent = new https.Agent({ keepAlive: true });
var req = https.get(option_1, function(res) {
res.on('data', function (body) {
// get the response string
});
res.on('end', function () {
// get the result1
});
});
if (result1 == null) return;
// using result1 to generate option_2
option_2.agent = new https.Agent({ keepAlive: true });
var req2 = https.request(option_2, function(res) {
res.on('data', function (body) {
// get the response string
});
res.on('end', function () {
// get the result2
})
});
if (result2 == null) return;
// using result2 to generate option_3
option_3.agent = new https.Agent({ keepAlive: true });
var req3 = https.request(option_3, function(res) {
res.on('data', function (body) {
// get the response string
});
res.on('end', function () {
// get the result3
})
});
console.log(result3);