LINUX.ORG.RU

Аномалия в http запросах

 ,


0

1

Делаю 10 параллельных http запросов, 5 из них выполняются мгновенно, остальные 5 только через 4 минуты. Хост не имеет значения, менял на разные


var http = require('http');
const querystring = require('querystring');

function log(str){
    console.log(str);
}

function error(str){
    log("ERROR: "+str);
}

var opt = {
    port: 80,
    hostname: 'google.ru',
    method: 'GET',
    path: '/auth.php?'
}


var d = new Date(); t = d.getTime();
for(var i = 0; i < 10; i++){
    
    !function(i){
        var req;
        req = http.request(opt);
        req.end();
        
        req.on('response', function(res){
            d = new Date();
            var t2 = d.getTime() - t;
            log('response'+i+", time: "+t2+'ms')
        })
        
        req.on('error', function(res){
            log(res)
        })
        req.on('abort', function(res){
            log(res);
        })
        
    }(i)
    
}

log('END');




вывод
response1, time: 36ms
response3, time: 41ms
response0, time: 41ms
response4, time: 42ms
response2, time: 42ms
response8, time: 240050ms
response9, time: 240051ms
response5, time: 240058ms
response6, time: 240065ms
response7, time: 240066ms



Можно видеть, что разница 240065~4 минуты. Что аномалия?

★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Если сделать

req.on('socket', function (socket) {
    socket.setTimeout(3000);  
    socket.on('timeout', function() {
        req.abort();
    });
});

то запрос последние 5 запросов будут выполнены через 3 секунды, если поставить таймаут в 300ms - то в течении 300ms и т.д.

gobot ★★★★
() автор топика

вероятнее всего то что ты грузишь-находиться на cloudflare хостинге(или подобном)

либо твой провайдер

и да-«ожидание ответа»-неправильная проектировка

ты должен долбиться и убивать потоки(зависшие) в нужный адрес без остановки,как минимум двумя параллельными запросами по очереди убивая и перезапуская каждый,а не ждать ответа

все веббраузеры так работают(как и весь интернет)-никто не ждет ответов,проще долбиться без остановки

jsi36331
()
Ответ на: комментарий от darkenshvein

не могу проверить, нет http сервера на нем

gobot ★★★★
() автор топика
Ответ на: комментарий от jsi36331

Нет, сервер выделенный, провайдер проверенный 2 года.
Бред - не должен он виснуть, должен быть получен либо ответ, либо ошибка, но ни туда ни туда ничего не приходит

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Бред - не должен он виснуть

nodejs

что еще джаваскрипт тебе должен?

или ты даже на питоне не писал?

питон лагущее г-но,и джаваскрипт-просто несравнимо с питоном по лагучести,в миллиадры раз лагучее и кривее

но какая разница,когда можно долбить по 100 запросов за раз

jsi36331
()

твой код нормально работает

//>>>> END
//>>>> response2, time: 1157ms
//>>>> response0, time: 1172ms
//>>>> response3, time: 1172ms
//>>>> response1, time: 1172ms
//>>>> response5, time: 1172ms
//>>>> response6, time: 1188ms
//>>>> response4, time: 1188ms
//>>>> response8, time: 1188ms
//>>>> response7, time: 1204ms
//>>>> response9, time: 1204ms
//>>>> 

currency2017
()
Ответ на: комментарий от jsi36331

не понятно, зачем это нужно, сервер может и заблокировать за такое.

и убивать потоки(зависшие)

А в nodejs такая возможность есть вообще?

currency2017
()
Ответ на: комментарий от jsi36331

Да нет, все проще оказалось. Нужно было соединение закрывать вручную, сразу после ответа.

req.abort();

Но другой вопрос, почему больше 5 соединений не открывает, где это настраивается?

gobot ★★★★
() автор топика
Ответ на: комментарий от currency2017

Без выставления таймаута? Странно, у меня больше 5 соединений параллельных не открывает нода. Нужно сначала закрыть старые

gobot ★★★★
() автор топика
Ответ на: комментарий от jsi36331

и джаваскрипт-просто несравнимо с питоном по лагучести,в миллиадры раз лагучее и кривее

Да лан п*ть то, пистон тормозней на порядки, к тому же в JS асинхронность везде искаропки.

currency2017
()
Ответ на: комментарий от gobot

А зачем выставлять таймаут? Ты чего хочешь добиться этим?

Нужно сначала закрыть старые

Возможно пока ты тестировал слишком рьяно, у тебя в оси всплыло ограничение на число одновременно открытых соединений.

currency2017
()
Ответ на: комментарий от currency2017

А что в линуксе есть возможность ограничить количество одновременных HTTP соединений???

gobot ★★★★
() автор топика
Ответ на: комментарий от currency2017

Ядро линукса не работает на прикладном уровни OSI, там можно лимитировать только tcp, udp...

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Нужно было соединение закрывать вручную

ваши хипсто-языки вас там совсем думать отучат скоро.

matrixd
()
Ответ на: комментарий от gobot

это открытые файлвые дискрипторы. Думается открытые соединения как раз подчинаются этому лимиту. Может я не прав конечно.

matrixd
()
Ответ на: комментарий от jsi36331

ты должен долбиться и убивать потоки(зависшие) в нужный адрес без остановки,как минимум двумя параллельными запросами по очереди убивая и перезапуская каждый,а не ждать ответа
все веббраузеры так работают(как и весь интернет)-никто не ждет ответов,проще долбиться без остановки

откуда дровишки?

quest ★★★★
()
Последнее исправление: quest (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.