Wie können Sie Anrufe auf externe Prozesse in Node.JS beschränken (oder in Warteschlangen stellen)?

8

Szenario

Ich habe einen Node.JS-Dienst (geschrieben mit ExpressJS ), der Bilduploads über DnD akzeptiert ( Beispiel ). Nachdem ein Bild hochgeladen wurde, mache ich ein paar Dinge dazu:

  1. Ziehen Sie EXIF-Daten von ihm
  2. Ändern Sie die Größe

Diese Anrufe werden momentan über das Modul node-imagemagick abgewickelt, und mein Code sieht ungefähr so ​​aus:

%Vor%

Frage

Wie einige von euch bereits bemerkt haben, besteht das Problem darin, dass wenn ich genug gleichzeitige Uploads erhalte, jedes einzelne dieser Uploads einen 'Identitätsanruf' und dann eine Größenänderung (von Image Magick) auslöst, was den Server unter high hochbringt laden.

Das Testen mit ab -c 100 -n 100 sperrt meinen kleinen 512-Linode-Dev-Server so, dass ich einen Neustart erzwinge. Ich verstehe, dass mein Test möglicherweise zu viel Belastung für den Server ist, aber ich möchte einen robusteren Ansatz für die Verarbeitung dieser Anforderungen, so dass ich einen eleganteren Fehler als totalen VM-Selbstmord habe.

In Java habe ich dieses Problem gelöst indem Sie einen ExecutorService mit festem Thread erstellen, der die Arbeit in die Warteschlange stellt und ihn höchstens für die X-Anzahl von Threads ausführt.

In Node.JS bin ich nicht einmal sicher, wo ich anfangen soll, ein Problem wie dieses zu lösen. Ich habe mein Gehirn nicht ganz um die Nicht-Thread-Natur gewickelt und wie ich eine asynchrone JavaScript-Funktion erstellen kann, die die Arbeit in eine Warteschlange stellt, während eine andere ... (thread?) Die Warteschlange verarbeitet.

Irgendwelche Hinweise darauf, wie man darüber nachdenkt oder wie man sich diesem annähert, wären willkommen.

Zusatz

Das ist nicht dasselbe wie diese Frage zu FFMpeg , obwohl ich Stellen Sie sich vor, dass diese Person genau diese Frage hat, sobald ihre Webanwendung unter Last steht, da sie auf dasselbe Problem hinausläuft (gleichzeitig zu viele gleichzeitige native Prozesse abfeuern).

    
Riyad Kalla 02.09.2011, 23:52
quelle

3 Antworten

2

Das Thread-Modul sollte genau das sein, was Sie brauchen:

Ссылка

    
Rob 03.09.2011, 05:47
quelle
2

Da Node Threading nicht zulässt, können Sie in einem anderen Prozess arbeiten. Sie können ein Hintergrundjobsystem verwenden, z. B. resque , in dem Sie Jobs in einen Datastore eines Typs und in der Warteschlange einreihen Führen Sie dann einen Prozess (oder mehrere Prozesse) aus, der Jobs aus dem Datenspeicher abruft und die Verarbeitung ausführt. oder verwenden Sie etwas wie node-worker und stellen Sie Ihre Jobs in den Arbeitsspeicher ein. In beiden Fällen ist Ihre Hauptanwendung von der gesamten Verarbeitung befreit und kann sich darauf konzentrieren, Webanforderungen zu bedienen.

[Update] Eine weitere interessante Bibliothek zum Auschecken ist hook.io , besonders wenn Sie die Idee von Node- Arbeiter wollen aber mehrere Hintergrundprozesse ausführen. [/ Update]

[Bearbeiten]

Hier ist ein kurzes und schmutziges Beispiel für das Drücken von Arbeit, die eine Weile dauert, bis sie mit node-worker zu einem Arbeitsprozess läuft. Der Worker stellt Jobs in eine Warteschlange und verarbeitet sie nacheinander:

app.js

%Vor%

image_processor.js

%Vor%     
Michelle Tilley 03.09.2011 01:04
quelle
1

Für alle, die der Meinung waren, dass Brandon schnell und schmutzig sein könnte, zu schnell und schmutzig, hier ist eine Variation, die nicht länger ist und nicht unnötig beschäftigt ist - warten. Ich bin nicht in der Lage, es zu testen, aber es sollte funktionieren.

%Vor%     
Malvolio 03.09.2011 08:21
quelle

Tags und Links