Цикл событий для больших файлов? - PullRequest
9 голосов
/ 03 августа 2011

Если я не ошибаюсь, я помню, что модель асинхронного ввода-вывода (цикл обработки событий) (Node.js, Nginx) не подходит для обслуживания больших файлов.

Так ли это, и если да, то есть ли какие-то методы? Я подумываю написать обозреватель / файловый сервер в режиме реального времени в Node, но размер файлов может быть от 100 МБ до ~ 3 ГБ. Я предполагаю, что цикл обработки событий будет блокироваться до тех пор, пока файл не будет полностью обработан?

Ответы [ 2 ]

21 голосов
/ 03 августа 2011

Нет, оно не будет заблокировано. node.js прочитает файл в виде фрагментов и затем отправит эти фрагменты клиенту. Между порциями он будет обслуживать другие запросы.

Чтение файлов и отправка данных по сети являются операциями, связанными с вводом / выводом. Сначала node.js попросит операционную систему прочитать часть файла, и пока ОС делает это, node.js будет обслуживать другой запрос. Когда ОС возвращается к node.js с данными, node.js сообщит ОС об отправке этих данных клиенту. Во время отправки данных node.js будет обслуживать другой запрос.

Попробуйте сами:

Создать большой файл

dd if=/dev/zero of=file.dat bs=1G count=1

Запустите приложение node.js

var http = require('http');
var fs = require('fs');

var i = 1;
http.createServer(function (request, response) {
    console.log('starting #' + i++);
    var stream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 });
    stream.pipe(response);
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');

Запросите http://127.0.0.1:8000/ несколько раз и наблюдайте, как node.js обрабатывает их все.

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

2 голосов
/ 03 августа 2011

Если я не ошибаюсь, я помню, что модель асинхронного ввода-вывода "цикл обработки событий" (Node.js, Nginx) не подходит для обслуживания больших файлов.

Я думаю, вы правы, что node.js не оптимизирован для обслуживания больших файлов.Я советую вам взглянуть на слайды Райана Даля .Особенно

Слайд 14

Вау.Узел сосет при обслуживании больших файлов.Более 3 секунд ответов для 256-килобайтных файлов при 300 одновременных подключениях.

Слайд 15

Что происходит: в V8 есть сборщик мусора поколений.Перемещает объекты случайным образом.Узлу не удается получить указатель на необработанные строковые данные для записи в сокет.

Слайд 21

Но факт остается фактом, толкая большие строкик сокету идет медленно.

Надеюсь, это может быть смягчено в будущем.

интересно.Возможно, это изменилось, но я думаю, что было бы лучше использовать NGinx для обслуживания ваших статических файлов (или, возможно, CDN).Я думаю, что вы дезинформированы, что NGinx плохо обслуживает большие файлы.Node.js (был) плох в этом из-за сборки мусора в V8, а не из-за цикла обработки событий.Также эта ссылка может быть интересна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...