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 делает много других вещей, кроме того, что вы сказали.