2

Вопрос по webserver, javascript, node.js – Параллельные запросы на веб-сервере Node.js

Если у меня есть веб-сервер, на котором работает Node.js, смогу ли я одновременно обслуживать несколько запросов? Из моих предварительных тестов я вижу, что Node, будучи в первую очередь однопоточным, в настоящий момент может обрабатывать только один HTTP-запрос. Но если один запрос занимает слишком много времени (например, загрузка больших данных), тогда все остальные запросы должны ждать.

Есть ли обходной путь для этой ситуации? Можем ли мы написать код так, чтобы он мог одновременно обрабатывать несколько HTTP-запросов?

<span>Если ваше приложение может обслуживать только один HTTP-запрос за раз, тогда вымы сделали что-то не так. В частности, убедитесь, что вы нет используя любой из *<code>Sync</code> методы.</span>

Mar 03, 2013, 11:34 PMотjosh3736

3ответа

0

Когда запрос занимает много времени, этоНе потому, что процессору требуется много времени для обработки запроса. Это'потому что он тратит много времени на ожидание каждого куска данных.В это время ожидания node.js может обрабатывать другие запросы, что делает его очень масштабируемым и гораздо более эффективным, чем многопоточная модель, которую использует большинство других платформ. Для подробного обсуждения см.проблема C10k Дэн Кегель.

События JavaScript работают, имея очередь событий. Эта очередь добавляется каждый раз, когда происходит событие (например, операция чтения файла или порция данных из запроса сервера). Пока полученный код обработки события неслишком высокая загрузка процессора, очередь неОбычно он получается очень длинным, и код выполняется почти сразу. Вот почему почти все в node.js является асинхронным.

7

Тот факт, что Node является однопоточным, не обязательно означает, что он может обрабатывать только 1 запрос за один раз.

Многовещи в узле нарочно асинхронны; например, многие операции с файловой системой, запросы к БД и т. д. Это образ мышления:

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

Именно в этот момент другиеРабота (которые могут быть другие запросы) обрабатываются. Конечно, еслиOни затем придется выполнить асинхронную операцию, поток операции может вернуться туда, где мы остановились раньше, потому что другая операция завершена.

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

Наличие нескольких потоков работы выгодно, только если у вас несколько процессорных ядер; тогда каждый поток операций может работать на разных ядрах. Для этого у Node естьcluster модуль, который вы должны посмотреть.

2

Как мы видим в файле node.js, у нас есть неблокирующая серверная платформа ввода-вывода. Таким образом, мы можем обслуживать несколько запросов одновременно. Например: -

Рассмотрим обработку файлов как случай: -

var fs=require("fs");
console.log("starting");
fs.readFile("path-to-file", function(error, data){
    console.log("Content:"+data);
});
console.log("Carry on executing");

ВЫХОД:-

starting
carry on executing
Content: data

Таким образом, мы можем видеть, что пока мы ожидаем содержимое файла, наш код продолжит выполнение

RelatedQuestions