2017-01-02 6 views
0

Ich habe ein Skript in Nodejs geschrieben, das einen Screenshot von Websites (mit slimerJs), dieses Skript dauert etwa 10-20 Sekunden dauert, das Problem hier ist der Server ist blockiert, bis dieses Skript beendet ist.Wie man eine Warteschlange in Nodejs verwaltet?

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) 
     } 
    }); 
    }) 
}); 

Da das Skript einen Firefox-Browser im Speicher laicht und lädt die Webseite, kann die RAM-Auslastung bis zu 600-700mb Spitze, und damit kann ich diesen Befehl nicht asynchron ausgeführt werden als ram teuer auf Servern ist.

kann ich wissen, ob es möglich ist, die eingehenden Anfragen in die Warteschlange zu stellen und sie in FIFO-Mode auszuführen?

Ich habe versucht, Pakete wie kue, bull und biene-queues zu überprüfen, aber ich denke, dass alle annehmen, dass die Jobliste bereits bekannt ist, bevor die Warteschlange gestartet wird, wo meine Jobliste von Benutzern abhängt, die die Site verwenden Sag den Leuten auch, dass sie in der Warteschlange sind und warten müssen, bis sie an der Reihe sind. Ist das mit den oben genannten Paketen möglich?

Antwort

0

Wenn ich die ähnliche Sache machen würde, würde ich diese Schritte versuchen.

1.Ein Array (eine Warteschlange) zum Speichern angeforderter Informationen, wenn eine Anfrage kommt, diese Informationen im Array speichern und eine Nachricht an die Benutzer zurücksenden, ihnen sagen, dass sie sich in der Warteschlange befinden oder der Server beschäftigt ist wenn es schon zu viele Anfragen gibt.

2.Der Screenshot-Job wird asynchron, aber nicht alle gleichzeitig ausgeführt. Sie könnten den Job starten, wenn Sie feststellen, dass die Warteschlange leer ist, wenn eine neue Anfrage eingeht, und eine weitere rekursiv startet, wenn Sie die letzte abgeschlossen haben.

3.Benachrichtigen Sie den Benutzer, der den Auftrag abgeschlossen hat, per Polling oder auf andere Weise.

+0

ich benutzte kue und societ.io, um dieses Problem zu beheben, danke für die Hilfe –

Verwandte Themen