2016-06-04 5 views
0

Ich habe eine Node.js-App mit einer kleinen Gruppe von Benutzern, die derzeit mit einem einzigen Web-Prozess aufgebaut ist. Ich denke darüber nach, einen After-Save-Trigger hinzuzufügen, der aufgerufen wird, wenn ein Datensatz zu einer meiner Tabellen hinzugefügt wird. Wenn der Trigger nach dem Speichern ausgeführt wird, möchte ich eine große Anzahl von IO-Operationen für externe APIs durchführen. Die Anzahl der IO-Operationen hängt von der Anzahl der Elemente in einer Array-Spalte im Datensatz ab. Daher könnte ich eine große Anzahl von asynchronen Operationen ausführen, nachdem jeder Datensatz in dieser bestimmten Tabelle gespeichert wurde.Wann muss ich Worker-Prozesse in Heroku verwenden?

Ich dachte daran, diese Arbeit in einen Hintergrundjob zu verschieben, wie in Worker Dynos, Background Jobs and Queueing vorgeschlagen. Der Artikel gibt als Faustregel an, dass Aufgaben, die länger als 500 ms dauern, in den Hintergrundjob verschoben werden. Aber nachdem ich das Beispiel mit RabbitMQ (Asynchronous Web-Worker Model Using RabbitMQ in Node) durchgearbeitet habe, bin ich nicht überzeugt, dass es sich lohnt, alles einzurichten.

meine Fragen sind also:

  • Für eine Anwendung mit einer begrenzten Menge an gleichzeitigen Benutzern, ist es in Ordnung, eine lange Lauffunktion in einem Web-Prozess zu verlassen?
  • Wenn ich schließlich beschließe, diese Arbeit an einen Hintergrundjob zu senden, scheint es nicht so schwer zu sein, meinen After-Save-Trigger zu ändern. Fehle ich etwas?
  • Gibt es eine Möglichkeit, dies einfacher zu tun als eine Nachrichtenwarteschlange zu implementieren?
+0

Wie lange läuft? Herokus Router wird eine Anfrage beenden, die mehr als 30 Sekunden dauert. https://devcenter.heroku.com/articles/request-timeout – ceejayoz

+0

Nein, es würde definitiv nicht so lange dauern. Ich denke, es wären weniger als 10 Sekunden. – toddg

+0

Dann, solange die Benutzer, denen die lange Anfrage entgegenkommt, nichts dagegen haben, ist es gut, das später zu veröffentlichen. – ceejayoz

Antwort

1

Für eine Anwendung mit einer begrenzten Menge an gleichzeitigen Benutzern, ist es in Ordnung, eine lange Lauffunktion in einem Web-Prozess zu verlassen?

Dies ist mehr eine Frage der Präferenz, als alles andere.

im Allgemeinen sage ich nein - es ist nicht ok ... aber das basiert auf der Erfahrung beim Aufbau von rabbitmq-Diensten, die in heroku-Arbeitern laufen, und das nicht als eine schwierige Sache zu sehen.

mit ein wenig Übung, können Sie feststellen, dass dies die einfachere Lösung ist, wie ich habe (es ermöglicht einfacheren Code und robusteren Code, wie es das Web vom Hintergrundprozessor trennt - so dass jeder laufen kann ohne zu wissen über einander direkt)

Wenn ich schließlich beschließe, diese Arbeit an einen Hintergrundjob zu senden, scheint es nicht so schwer zu sein, meinen After-Save-Trigger zu ändern. Fehle ich etwas?

fehlt Ihnen etwas? nicht wirklich

solange Sie Ihren aktuellen in-the-web-Prozess-Code in einem gut strukturiert und modular schreiben, ist es zu einem Hintergrundprozess bewegt sich nicht in der Regel eine große Sache

die meisten der Panik, Menschen bekommen von Code in den Hintergrund zu bewegen, kommt von ihrem Code eng mit dem HTTP-Anfrage/Antwort-Prozess gekoppelt ist (ich weiß aus eigener Erfahrung, wie schmerzhaft es sein kann)

Gibt es eine Möglichkeit, dies zu tun das ist einfacher als eine Nachrichtenwarteschlange zu implementieren?

Es gibt viele Optionen für verteilte Berechnungen und Hintergrundverarbeitung.Ich persönlich mag RabbitMQ und die Messaging-Muster, die es verwendet.

ich würde vorschlagen, es zu versuchen und zu sehen, wenn es etwas ist, das gut für Sie arbeiten kann. Andere Optionen umfassen Redis mit Pub/Sub-Bibliotheken darüber, direkte HTTP-API-Aufrufe an einen anderen Webserver oder einfach einen Timer in Ihrem Hintergrundprozess verwenden, um Datenbanktabellen auf einer bestimmten Frequenz zu überprüfen und den Code ausführen zu lassen basierend auf den Daten, die es findet.

p.s. Sie können meine RabbitMQ For Developers Kurs von Interesse finden, wenn Sie tiefer in RMQ w/node graben wollen: http://rabbitmq4devs.com

+0

Wow, das ist super hilfreich. Zufälligerweise war Ihr Artikel Richtiges Behandeln von Webhooks mit Node und Express einer von denen, die ich gestern in meinem Deep-Dive über das Thema gelesen und mit Lesezeichen versehen habe. Vielen Dank! Eine zusätzliche Frage: Wenn ich einen direkten http-Anruf zu einem anderen Server verwende, kann ich sofort eine "200 Ok" -Antwort senden und dann den Rest der Funktion ausführen? In meinem Fall muss der Anrufer nicht wissen, dass der Angerufene erfolgreich abgeschlossen wurde. – toddg

+0

könnten Sie das tun - sofort 200 OK senden und dann die Verarbeitung beenden. aber das könnte zu anderen Problemen führen. der Client würde nie wissen, dass der Server fehlerhaft ist usw. –