Сценарий
У меня есть служба Node.JS (написана с использованием ExpressJS ), которая принимает загрузки изображений через DnD ( пример ).После загрузки изображения я делаю с ним несколько вещей:
- Извлечение из него EXIF-данных
- Изменение размера
Эти вызовы обрабатываютсячерез модуль node-imagemagick , и мой код выглядит примерно так:
app.post('/upload', function(req, res){
... <stuff here> ....
im.readMetadata('./upload/image.jpg', function(err, meta) {
// handle EXIF data.
});
im.resize(..., function(err, stdout, stderr) {
// handle resize.
});
});
Вопрос
Как некоторые из вас ужепроблема в том, что если я получу достаточное количество одновременных загрузок, каждая из этих загрузок вызовет «идентификационный» вызов, а затем операцию изменения размера (из Image Magick), эффективно убивающую сервер при высокой нагрузке.
Просто тестирование с ab -c 100 -n 100
блокирует мой маленький 512 Linode dev server таким образом, что я вынужден перезагрузить компьютер.Я понимаю, что мой тест может быть слишком загружен для сервера, но я хотел бы более надежный подход к обработке этих запросов, чтобы у меня был более изящный сбой, чем полное самоубийство виртуальной машины.
В Java I решил эту проблему , создав службу ExecutorService с фиксированным потоком, которая ставит работу в очередь и выполняет ее не более чем в количестве потоков.
В Node.JS я даже не уверен, с чего начатьрешить проблему, как это.У меня не совсем получается, что мой мозг не связан с многопоточностью, и как я могу создать асинхронную функцию JavaScript, которая ставит работу в очередь, пока другой ... (поток?) Обрабатывает очередь.
Любые указателио том, как думать об этом или как подойти к этому, будет оценено.
Приложение
Это не то же самое, что этот вопрос о FFMpeg , хотя я предполагаю, что у этого человека будет точно такой же вопрос, как только его веб-приложение будет загружено, поскольку оно сводится к той же проблеме (запуск слишком большого количества параллельных собственных процессов параллельно).