2016-05-13 8 views
0

Ich entwickle eine App Engine-Anwendung, bei der eine HTTP-Anfrage eine undefinierte Anzahl von Aufgaben hervorbringt (kann 10, kann 100, kann 1000 sein). Diese Aufgaben werden in der PUSH-Warteschlange ausgeführt.App Engine Java - Führe das letzte Ereignis aus, wenn alle Aufgaben ihren Prozess abgeschlossen haben

Wenn alle Aufgabe beendet ist, brauche ich eine abschließende Aktion, die den Status jeder Aufgabe erhalten und erstellt einen Abschlussbericht (eine Zusammenfassung aller ausgeführten Operationen). In diesem Beispiel nehmen wir an, dass es sich um eine E-Mail-Zustellung handelt.

Eine weitere Information ist, dass die Aufgabe nach einem gemeinsamen Wert gruppiert ist (nennen wir group_id). Wenn alle Aufgaben derselben Gruppen-ID beendet sind, kann das Ereignis für diese bestimmte Gruppe ausgeführt werden. Diese Spezifikation, die ich gemacht habe, ist, weil, wenn andere Aufgaben noch laufen, aber es andere Gruppen-ID gibt, das Ereignis für diese Gruppe auch ausgeführt werden kann.

Ich frage mich, welcher der beste Ansatz ist, um so etwas zu implementieren. Natürlich kann es viele "hausgemachte" Lösung geben, wo ich zum Beispiel den Status jeder Aufgabe in einer Datastore-Entität speichern und jeden Status abrufen kann oder jede Aufgabe ihre Brüder "befragen" und prüfen kann, ob es die letzte ist ein.

Meine Frage ist, ob es eine höhere Lösung gibt, dieses Verhalten zu implementieren.

Mit einer schnellen Suche fand ich die Pipeline-API [1], die vielversprechend zu sein scheint, aber ich bin mir nicht sicher zu verstehen, ob es die richtige Lösung für das Verhalten, das ich brauche. Auf Stackoverflow ist diese Bibliothek sehr gut akklamiert, also ist vielleicht der richtige Weg dazu.

Hier einige der Thread gelesen I

Wenn ich es richtig, die Umsetzung für dieses Pipeli verstehen ne-API, wenn ein Job gestartet wird, stellt er eine Job-ID bereit, um zu testen, ob sie beendet wurde oder noch läuft. Wenn dies der Fall ist, erfordert dies eine externe Abfrage des Jobstatus, was nicht mein Fall ist. Mein besonderes Bedürfnis ist, wenn die letzte fertig, das letzte Ereignis automatisch ausgelöst wird

[1] https://github.com/GoogleCloudPlatform/appengine-pipelines

+0

Man könnte argumentieren, dass die Pipelines auch eine "hausgemachte" Lösung sind. Es verwendet grundsätzlich das gleiche Prinzip, bei dem Sie den Status im Datenspeicher speichern. Hausgemacht ist gut mit mir, also würde ich damit gehen. Wenn Sie eine parallele Ausführung wünschen und die App-Engine nicht verwenden möchten, sollten Sie sich den Google Dataflow ansehen, der im Grunde für genau diesen Zweck entwickelt wurde. Dies setzt voraus, dass Sie Daten hier verarbeiten. Außerdem habe ich State-Machines in App Engine implementiert, die ähnlich wie Pipelines funktionieren und den Datenspeicher zum Speichern von Kontexten verwenden. Ein Cron-Job kann prüfen, ob alle Kontexte abgeschlossen sind – konqi

Antwort

1

Sie eine einzige Datenspeicherentität die Anzahl der Aufgaben zu speichern group_id verwenden können, gestartet und die Anzahl der Aufgaben abgeschlossen. Nach Abschluss aktualisiert jede Aufgabe diese Entität. Wenn die Anzahl der abgeschlossenen Aufgaben der Anzahl der gestarteten Aufgaben entspricht, wird die "letzte" Aufgabe zum Generieren eines Berichts erstellt.