Конкретный код - множественный запрос в узле зависания цикла, особенно при соединении с низкой пропускной способностью.
const baseRequest = request.defaults();
const specialRequest = baseRequest.defaults( {
agent : false //// MUCH better but still errors sometimes happened (on high bandwidth connection - 1mB/s)
//agent : false, pool : {maxSockets: 100} //// WORKS! - no errors on high bandwidth 1mB/s //// ERRORS - on low 50kB/s(down) 10kB/s(up) bandwidth connection - but moust of the requests are corectly served
//agent : false, pool : {maxSockets: 500} //// ERRORS on high bandwidth 1mB/s //// ERRORS - on low 50kB/s(down) 10kB/s(up) bandwidth connection
//agent : false, pool : {maxSockets: 500}, timeout : 5000 //// ERRORS on high bandwidth 1mB/s //// ERRORS - on low 50kB/s(down) 10kB/s(up) bandwidth connection
});
process.env.UV_THREADPOOL_SIZE = 128;
// promises array to store mutations (data)
var urlDataPromiseArray = [];
var sizeDataPromiseArray = [];
// here is the function (request) to grab the data:
function getData(url, i) {
return new Promise(function (resolve) {
var serverWork = 'serverWork/dataSave_' + i + '_.txt';
var fs_cws_serverWork = fs.createWriteStream(serverWork, 'utf8');
var requestData = specialRequest({url : url}, function(err, resp, data) {
if (err || resp.statusCode >= 400) {
if (err) {
console.log('something goes bad! - ' + err + ' --- ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' bad');
}
else {
console.log('something goes bad! - ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' bad');
}
}
else if (!err && resp.statusCode === 200) {
var dataLength = data.length;
console.log('ok! - ' + i + ' - ' + dataLength);
sizeDataPromiseArray.push(getSize(i, dataLength));
return resolve(i + ' good - ' + dataLength);
}
else {
console.log('need to check - ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' shit happens');
}
}).pipe(fs_cws_serverWork);
})
}
// another function to calculate size of downloaded data
function getSize(i, size) {
return new Promise(function(resolve) {
resolve({
[i]: size
});
});
}
// here we prepare the loop:
var loop = 1000;
for (var i = 0; i < loop; i++) {
urlDataPromiseArray.push(getData('https://www.google.com', i));
sizeDataPromiseArray.push(getSize(i, 0));
}
Promise.all(urlDataPromiseArray).then(function(url) {
console.log();
console.log('===============');
console.log('===============');
console.log('===============');
console.log();
}).then(function() {
return Promise.all(sizeDataPromiseArray).then(function(size) {
size.forEach(function(item) {
for (var key in item) {
var value = item[key];
console.log('--------');
console.log(value + ' - size of request number: ' + key);
console.log('--------');
};
});
});
}).catch(function(err) {
console.log('ERROR: ' + err);
});
console.log();
console.log('===============');
console.log('loop is finished - now we wait for async work to be done');
console.log('===============');
console.log();
ОШИБКИ, которые я получаю:
розетка повесить трубку
читать ECONNRESET
подключить ETIMEDOUT IP: ПОРТ
ETIMEDOUT
ESOCKETTIMEDOUT
Когда я устанавливаю agent : false
, это НАМНОГО лучше, но все же ошибки иногда случаются при соединении с высокой пропускной способностью - 1 мБ / с, и есть много ошибок при соединении с НИЗКОЙ полосой пропускания [50 кБ / с (вниз), 10 кБ / с (вверх)] лайк:
- socket hang up
и read ECONNRESET
, а также и все connect ETIMEDOUT IP:PORT
И -> обещания не работают <- </p>
Когда я установил agent : false, pool : {maxSockets: 100}
, он РАБОТАЕТ - никаких ошибок на ВЫСОКОЙ полосе пропускания 1 мБ / с, НО ОШИБКИ - на НИЗКОМ соединении полосы пропускания 50 кБ / с (вниз), 10 КБ / с (вверх) (но он работает лучше, чем с ' agent: false 'only - большинство запросов обслуживаются в основном) как:
- socket hang up
и read ECONNRESET
НО обещания решаются!
Когда я установил agent : false, pool : {maxSockets: 500}
, он РАБОТАЕТ - никаких ошибок на ВЫСОКОЙ полосе пропускания 1 мБ / с, НО ОШИБКИ - на НИЗКОМ 50 КБ / с (вниз) 10 КБ / с (вверх) подключении к полосе пропускания (на самом деле это намного хуже, чем в пуле) : {maxSockets: 100} 'опция) как:
- в основном socket hang up
, но также read ECONNRESET
, а обещания и 'connect ETIMEDOUT IP: PORT' AND -> не будут выполнены <- </p>
Когда я установил agent : false, pool : {maxSockets: 500}, timeout : 5000
- есть ошибки в HIGH bandwidth (1mB / s) - в LOW 50kB / s (down) 10kB / s (up) ошибки подключения пропускной способности выглядят так:
- многие ESOCKETTIMEDOUT
и многие ETIMEDOUT
НО обещания разрешаются правильно
Итак, я хочу обещать, что ВСЕГДА правильно решу. Все запросы должны быть обслужены БЫСТРО (потому что несколько клиентов подключаются к серверу), но они МОГУТ передавать ошибки - мне просто нужно, чтобы они были быстрыми - при низкой пропускной способности, могут передаваться только ошибки, но клиент должен знать, что это является причиной низкой пропускной способности сервера и должен получить этот ответ как можно скорее.
agent : false, pool : {maxSockets: 100}
- это очень хорошо работает на высокой пропускной способности (все хорошо, обещания проходят)
agent : false, pool : {maxSockets: 500}, timeout : 5000
- это лучше всего работает при низкой пропускной способности (быстрые ошибки, обещания разрешаются)
Как объединить их, чтобы они отлично работали на высокой пропускной способности и на низкой - последняя часть принята, как описано выше (ошибки) - но, возможно, я ничего не могу сделать лучше - и почему обещания не работают?
ПОХОЖИЕ ТЕМЫ: