Scenario
我有一个 Node.JS 服务(使用编写ExpressJS)通过 DnD 接受图像上传(example)。上传图像后,我对其执行一些操作:
- 从中提取 EXIF 数据
- 调整大小
这些电话正在通过节点 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.
});
});
Question
正如你们中的一些人已经发现的那样,问题是,如果我获得足够多的同时上传,那么每一个上传都会产生一个“身份”调用,然后产生一个调整大小操作(来自 Image Magick),从而有效地在高负载下杀死服务器。
只是测试ab -c 100 -n 100
锁定了我的小型 512 Linode 开发服务器,因此我必须强制重新启动。我知道我的测试可能对服务器来说负载太大,但我想要一种更强大的方法来处理这些请求,这样我就会有一个比完全虚拟机自杀更优雅的失败。
在爪哇我解决了这个问题通过创建一个固定线程 ExecutorService 将工作排队并在最多 X 个线程上执行它。
在 Node.JS 中,我什至不知道从哪里开始解决这样的问题。我不太了解非线程的性质以及如何创建一个异步 JavaScript 函数来对工作进行排队,而另一个...(线程?)处理队列。
任何关于如何思考这个问题或如何解决这个问题的指示将不胜感激。
Addendum
这与关于 FFMpeg 的这个问题,尽管我想这个人一旦他的 web 应用程序处于负载状态就会有这个完全相同的问题,因为它归结为同样的问题(并行触发太多同步本机进程)。