Сценарий
У меня есть служба Node.js (написана с использованием Expressjs ), которое принимает загрузку изображений через DND ( пример ). После того, как изображение загружено, я делаю ему несколько вещей:
Эти вызовы обрабатываются через модуль Node-ImageMagick модуль в данный момент И мой код выглядит что-то подобное:
app.post('/upload', function(req, res){
... ....
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 Lineode DEV Server UP, чтобы я должен заставить перезагрузку. Я понимаю, что мой тест может быть просто слишком большим нагрузкой для сервера, но я хотел бы более надежный подход к обработке этих запросов, поэтому у меня есть более изящный отказ, то общий объем самоубийства VM.
В Java I решил эту проблему , создав управление с фиксированной резьбой, который покидает работу и выполняет ее на уровне x количество потоков.
В Node.js я даже не уверен, что начать решать такую проблему. У меня не совсем мой мозг, обернутый вокруг нерезной природы, и то, как я могу создать функцию async JavaScript, которая вправляет работу в то время как другая ... (поток?) Обрабатывает очередь.
Любые указатели на том, как подумать об этом или как подойдут к этому будет оценено.
Дополнение
Это не то же самое, что и Этот вопрос о FFMPEG , хотя я представляю, что этот человек будет иметь этот точно такой же вопрос, как только его WebApp находится под загрузкой, так как его сводится к тому же Проблема (слишком много одновременных нативных процессов параллельно).