如何在Node.JS中限制(或队列)对外部进程的调用?

Riy*_*lla 8 javascript queue node.js

脚本

我有一个Node.JS服务(使用ExpressJS编写),通过DnD接受图像上传(示例).上传图片后,我会做一些事情:

  1. 从中提取EXIF数据
  2. 调整大小

这些调用目前正通过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.
  });
});
Run Code Online (Sandbox Code Playgroud)

正如你们中的一些人已经发现的那样,问题在于,如果我获得足够的同步上传,那么每个上传都会产生一个"身份"调用,然后是一个调整大小操作(来自Image Magick),有效地在高负载下杀死服务器.

只是用ab -c 100 -n 100锁定我的小512 Linode dev服务器进行测试,这样我就不得不强行重启.我知道我的测试可能只是服务器的负载太多,但我想要一个更强大的方法来处理这些请求,所以我有一个更优雅的失败,然后总VM自杀.

在Java中,我通过创建一个固定线程ExecutorService来解决这个问题,该ExecutorService将工作排队并在最多X个线程上执行它.

在Node.JS中,我甚至不确定从哪里开始解决这样的问题.我的大脑并没有完全围绕非线程性质,以及我如何创建一个异步JavaScript函数来排队工作,而另一个......(线程?)处理队列.

关于如何思考这个或如何处理这个的任何指针将不胜感激.

附录

这与关于FFMpeg的这个问题不同,虽然我想这个人一旦他的webapp处于负载状态就会有这个完全相同的问题,因为它归结为同样的问题(同时触发过多的同时本机进程).

小智 3

线程模块应该正是您所需要的:

https://github.com/robtweed/threads