如何在nodejs中管理队列?
How to manage a queue in nodejs?
我在 Nodejs 中编写了一个脚本来截取网站的屏幕截图(使用 slimerJs
),这个脚本需要大约 10-20 秒才能完成,这里的问题是服务器停滞直到这个脚本完成了。
app.get('/screenshot', function (req, res, next) {
var url = req.query.url;
assert(url, "query param 'url' needed");
// actual saving happens here
var fileName = URL.parse(url).hostname + '_' + Date.now() + '.png';
var command = 'xvfb-run -a -n 5 node slimerScript.js '+ url + ' '+ fileName;
exec(command, function (err, stdout, stderror) {
if(err){ return next(err); }
if(stderror && (stderror.indexOf('error')!= -1) ){ return next(new Error('Error occurred!')); }
return res.send({
status: true,
data: {
fileName: fileName,
url: "http://"+path.join(req.headers.host,'screenshots', fileName)
}
});
})
});
由于脚本在内存中生成一个 firefox 浏览器并加载网站,ram 使用量可能会飙升至 600-700mb,因此我无法异步执行此命令,因为 ram 在服务器上很昂贵。
我可以知道是否可以对传入请求进行排队并以 FIFO 方式执行它们吗?
我试过检查像 kue、bull 和 bee-queues 这样的包,但我认为这些都假设工作列表在队列开始之前就已经知道了,因为我的工作列表取决于使用该网站的用户,而且我还想告诉人们他们在排队,需要等待轮到他们。上述软件包是否可行?
如果我在做类似的事情,我会尝试这些步骤。
1.An 数组(一个队列)来存储请求的信息,当任何请求到来时,将这些信息存储在数组中,并向用户发回消息,告诉他们他们在队列中,或者如果已经有太多请求,服务器正忙。
2.Doing 屏幕截图作业,异步,但不是同时进行。如果有新请求来时发现队列为空,则可以开始工作,并在完成最后一个请求后递归开始另一个工作。
function doSceenShot(){
if(a.length > 1){
execTheJob((a[0])=>{
//after finishing the job;
doScreenShot()
})
}
}
3.Notify您通过投票或其他方式完成作业的用户。
我在 Nodejs 中编写了一个脚本来截取网站的屏幕截图(使用 slimerJs
),这个脚本需要大约 10-20 秒才能完成,这里的问题是服务器停滞直到这个脚本完成了。
app.get('/screenshot', function (req, res, next) {
var url = req.query.url;
assert(url, "query param 'url' needed");
// actual saving happens here
var fileName = URL.parse(url).hostname + '_' + Date.now() + '.png';
var command = 'xvfb-run -a -n 5 node slimerScript.js '+ url + ' '+ fileName;
exec(command, function (err, stdout, stderror) {
if(err){ return next(err); }
if(stderror && (stderror.indexOf('error')!= -1) ){ return next(new Error('Error occurred!')); }
return res.send({
status: true,
data: {
fileName: fileName,
url: "http://"+path.join(req.headers.host,'screenshots', fileName)
}
});
})
});
由于脚本在内存中生成一个 firefox 浏览器并加载网站,ram 使用量可能会飙升至 600-700mb,因此我无法异步执行此命令,因为 ram 在服务器上很昂贵。
我可以知道是否可以对传入请求进行排队并以 FIFO 方式执行它们吗?
我试过检查像 kue、bull 和 bee-queues 这样的包,但我认为这些都假设工作列表在队列开始之前就已经知道了,因为我的工作列表取决于使用该网站的用户,而且我还想告诉人们他们在排队,需要等待轮到他们。上述软件包是否可行?
如果我在做类似的事情,我会尝试这些步骤。
1.An 数组(一个队列)来存储请求的信息,当任何请求到来时,将这些信息存储在数组中,并向用户发回消息,告诉他们他们在队列中,或者如果已经有太多请求,服务器正忙。
2.Doing 屏幕截图作业,异步,但不是同时进行。如果有新请求来时发现队列为空,则可以开始工作,并在完成最后一个请求后递归开始另一个工作。
function doSceenShot(){
if(a.length > 1){
execTheJob((a[0])=>{
//after finishing the job;
doScreenShot()
})
}
}
3.Notify您通过投票或其他方式完成作业的用户。