Node.js блокирует?

Я думаю, что только что обнаружил что-то действительно странное с помощью node.js или браузеров. Таким образом, node.js должен быть неблокирующим, но простой setTimeout блокирует весь веб-сайт для одного и того же клиента.

Это код сервера:

// Create HTTP Server
var http = require('http');

// Create page number holder
var page = 0;

http.createServer(function (req, res) {
    // Increment Page Number
    page++; 

    // Log page load
    console.log('LOAD PAGE', page); 

    // Set response header
    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    // Wait 10 seconds and write Hello World message to client.
    setTimeout(function(){ res.end('Hello World\n'); }, 10000); 

}).listen(5000); // Listen on port 5000

// Log server start
console.log('Server running on port 5000.');

Итак, я говорю о том, что когда я пытаюсь открыть http://mysite.com:5000/ в Chrome(версия 25.0.1364.152) с двумя вкладками, первая вкладка должна завершиться до того, как вторая вкладка будет обработана узлом.js.

Это выглядит так:

Client: Open Tab1 
> server console: LOAD PAGE 1

Client: Open Tab2
> server console: Nothing happens

Server: Wait 10 seconds
> server console: LOAD PAGE 2

Я ожидаю, что node.js запустит оба запроса сразу, иначе это не неблокирование. Я уже проверил это с Firefox 19, так что, похоже, браузеры ведут себя так же.

Так что же происходит? Я что-то пропустил??: ОООО

ОБНОВИТЬ

Я просто запускаю тесты в Safari(6.0.2), и он работает нормально, так что это может быть проблема браузера с Chrome и Firefox и, возможно, другими.

Протестировано с Node.js версии v0.6.17 и v0.8.21

2 ответа

Решение

Браузер реализует ограничение одновременных подключений на доменное имя. Надрез:

Браузеры, как правило, ограничивают количество одновременных HTTP-соединений на сервер равным 2(термин "на сервер" здесь широко используется для простоты. Например, это может быть несколько физических машин, использующих один и тот же общедоступный IP-адрес.) Если Сеанс браузера уже имеет два HTTP-соединения, любые дальнейшие запросы на подключение должны будут ждать, пока одно из этих двух HTTP-соединений не будет завершено. В результате браузер (или приложение), кажется, заблокирован. Хотя "ограничение двух соединений" Это имело смысл несколько лет назад, и это очень проблематично в современных приложениях Ajax с поддержкой "Web 2.0".

Источник: http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue

Узел не блокирует, ваш браузер есть. Я рекомендую apache benchmark (ab -c 10 -n 10) для тестов.

Да, вы что-то упустили. Вы должны попробовать протестировать свой сервер с помощью чего-то другого, кроме полноценного веб-браузера. пытаться curl например.

Chrome делает много других вещей, кроме того, что вы сказали.

Другие вопросы по тегам