2016-08-03 51 views
0

Ich baute einen API-Server in Knoten js, die unter hoher Auslastung arbeiten soll. Ich möchte eingehende Einfügungsanfragen im Wesentlichen in kleinen Stapeln (etwa 10 Elemente) ansammeln, und sobald ein Stapel gefüllt ist, fügen Sie die Elemente in die Datenbank ein. Im Moment verwende ich Amazon SQS als meinen Warteschlangendienst und eine separate Warteschlangen-Consumer-Anwendung, die ich entwickelt habe. Ich dachte jedoch, ich könnte die Nachrichten lokal ansammeln und dann den Stapel direkt aus der API einfügen. Dies würde den Overhead der Kommunikation mit dem fernen Warteschlangendienst eliminieren, und da die Stapel klein sind, wird der Speicher des API-Servers nicht aufgeblasen. Was denken Sie? Vor-und Nachteile?API-Server - Warteschlangendienst vs lokale Mini-Warteschlange

Antwort

0

Sie haben erwähnt, dass Ihr Server stark ausgelastet ist. Wenn Sie versuchen, eine Warteschlange zu implementieren, um eingehende Anfragen zu erfassen, könnte dies am Ende zu viel Speicher auf Ihrem Server verbrauchen. Solange Sie keine Selbstskalierungsfunktion haben, ist dies immer ein Risiko. Sie sollten folgendes beachten: - Gesamtstapelgröße - maximale Größe jeder Anfrage Dies würde Ihnen helfen, Probleme mit dem Arbeitsspeicher zu vermeiden.

andere Überlegungen sollten sein: - ist es eine verteilte/Cluster-Umgebung? Wenn ja, dann überlegen Sie, ob 2 Anfragen zusammenhängen und möchten Sie diese auf einem Server zusammenlegen? - Timer: Hat Ihre Warteschlange einen Timer-Mechanismus? Ich kann sehen, dass ich db einfügen, so gibt es ein Szenario, dass eine Einfügung nicht warten kann, bis ein Batch abgeschlossen ist, um in db zu schreiben. Wenn ja, implementieren Sie den Timer, um fortzufahren (unabhängig davon, ob der Batch voll ist oder nicht) - Überprüfen Sie, ob der Server Spike-Attacken hat, ob Ihr Warteschlangen-Mechanismus in der Lage wäre, damit umzugehen? etwas wie Spike-out-Politik. - Ist ein Systemfehler ein Problem, bei dem Sie möglicherweise unvollständige Batch-Daten verlieren? - Ich kann sehen, dass Sie auf diese Weise versuchen, Laufzeit für Remote-Aufruf zu speichern. Aber wenn Sie Anfragen blockieren, um persistent zu werden (in einem Batch), ist Ihnen die Laufzeit wirklich wichtig? Wenn nicht, dann ist SQS zuverlässiger & effiziente Lösung.

andere als diese, versuchen Sie, Ihr System vor SQL-Injection-Angriffen zu verhindern.