2017-01-02 6 views
0

私はNodejsにウェブサイト(slimerJsを使用)のスクリーンショットを取るスクリプトを書いています。このスクリプトは約10-20秒かかるので、このスクリプトが完了するまでサーバーは停止しています。nodejsでキューを管理する方法は?

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〜700メガバイト件まで急上昇することができ、そしてラムは、サーバー上で高価であるとして、したがって、私は非同期的に、このコマンドを実行することはできません。

着信要求をキューに入れてFIFO形式で実行できるかどうかは分かりますか?

kue、bull、bee-queuesのようなパッケージをチェックしようとしましたが、キューが開始される前にジョブリストがすでにわかっていると思います。私のジョブリストはサイトを使用するユーザーに依存します。また、キューに入っていて、自分の番を待つ必要があることを人に伝えます。上記のパッケージで可能ですか?

答えて

0

私が似たようなことをしていたら、私はこれらのステップを試してみるでしょう。

1.要求された情報を格納するための配列(キュー)。要求が来たら、それらの情報を配列に格納し、ユーザにメッセージを返し、キューに入っていることを伝えるか、サーバがビジー状態です。すでにリクエストが多すぎる場合

2.スクリーンショットジョブを実行すると、非同期ですが、同時にすべてではありません。新しい要求が来たときにキューが空であることが分かったらジョブを開始し、最後のキューを完了したときに再帰的にキューを開始することができます。

function doSceenShot(){ 
    if(a.length > 1){ 
    execTheJob((a[0])=>{ 
     //after finishing the job; 
     doScreenShot() 
    }) 
    } 
} 

3.ポーリングなどの方法で、作業を終了したユーザーに通知します。

+0

私はこの問題を解決するためにkueとsociet.ioを使用しました。 –

関連する問題