2009-05-02 9 views
1

Ich entwickle Software mit der Google App-Engine.google app engine - Design Überlegungen zu Cron Aufgaben

Ich habe einige Überlegungen über das optimale Design in Bezug auf das folgende Problem: Ich muss Snapshots einiger Entitäten in regelmäßigen Abständen erstellen und speichern.

In der herkömmlichen relationalen Datenbank-Welt würde ich db-Jobs erstellen, die neue zusammenfassende Datensätze einfügen würden.

zum Beispiel würde ein Job einen Datensatz für jeden aktiven Benutzer einfügen, der sein aktuelles Ergebnis etwa jede Stunde in der Tabelle "userrank" enthalten würde.

Ich würde gerne wissen, was ist die beste Methode, um dies in Google App Engine zu erreichen. Ich weiß, dass es den Cron-Service gibt, aber erlaubt es uns, Jobs auszuführen, die Tausende von Datensätzen einfügen/aktualisieren?

+0

Ich würde mir vorstellen, dass es davon abhängt, ob Sie sich angemeldet haben, um es kostenlos zu versuchen oder den Dienst zu abonnieren. Der Umgang mit Tausenden von Datensätzen auf einer Cron-Basis klingt, als ob Sie ein Abonnent sein sollten. Kannst du deinen Status klären?Zahlen Sie für Ihre App Engine-Zeit? – duffymo

+0

Nachdem wir die Anwendung auf einem bestimmten Level haben, werden wir den Dienst abonnieren. Aber lassen Sie mich eine Frage stellen, ob es ein Abonnent ist oder nicht, auf Anfrage Timeouts zu machen. Ich bin mir nicht sicher, ob sie mich Tausende von Aufzeichnungen verarbeiten lassen, selbst wenn ich dafür bezahle. Recht? – shanyu

+0

Wenn die Aktivierung aktiviert ist, wird eine Reihe von Limits ausgelöst, aber das Zeitlimit für die Anforderung gehört nicht dazu. –

Antwort

2

Haben Sie die Verwendung der remote api stattdessen in Betracht gezogen? Auf diese Weise können Sie eine Shell in Ihren Datenspeicher laden und Zeitüberschreitungen vermeiden. Die Mapper-Klasse, die sie in diesem Link demonstrieren, ist sehr nützlich und ich habe sie erfolgreich verwendet, um Stapeloperationen für ~ 1500 Objekte durchzuführen.

Das sagte, Cron sollte auch gut funktionieren. Sie haben eine Zeitbegrenzung für jede einzelne Anfrage, so dass Sie nicht alle auf einmal durchkauen können. Sie können jedoch die Umleitung verwenden, um so viele Benutzer wie möglich zu durchlaufen und jeweils einen Benutzer zu bearbeiten. Es sollte irgendwo in der Dokumentation ein Beispiel dafür geben, wenn Sie bei diesem Ansatz Hilfe benötigen.

+0

danke, Kiv. Betrachten Sie dieses Szenario: Ich habe 5000 Benutzer, und eine Cron-Aufgabe vor dem Zeitlimit kann 100 Benutzer verarbeiten. das bedeutet, dass ich die Cron-URL 50 Mal aufrufen muss. Werde ich in der Fahndungsliste von Google sein, wenn ich das tue, und so wichtig es ist, ist es eine gute Übung? und in Bezug auf die Remote-API, haben Sie irgendwelche Vorschläge, wie Sie die Planung für Remote-API-Ausführung tun? – shanyu

+0

Ich glaube nicht, dass das ein Problem wäre. Die Kontingente, die sie dir geben, sind sehr großzügig. Behalte also deine Quoten im Auge, um sicher zu gehen, dass du nicht hinüberkommst. – Kiv

+0

Eine Möglichkeit, die Remote-API-Ausführung zu planen, besteht darin, dass Ihr lokaler Computer eine normale Crontask (nicht App Engine) ausführt, die nur Ihr Remote-API-Skript ausführt. Dies erfordert jedoch, dass Sie den lokalen Computer ständig eingeschaltet haben. – Kiv

3

Ich denke, Sie werden feststellen, dass Snapshotting jeden Status des Benutzers jede Stunde ist nicht etwas, das gut skalieren wird, egal, was Ihr Framework. Eine gewöhnliche Umgebung verschleiert dies, indem Sie länger laufende Aufgaben haben, aber Sie werden immer noch den Punkt erreichen, an dem es nicht praktisch ist, jede Stunde eine Momentaufnahme der Daten jedes Benutzers zu machen.

Mein Vorschlag wäre dies: Fügen Sie ein 'last snapshot' Feld hinzu und Unterklasse der put() Funktion Ihres Modells (vorausgesetzt, Sie verwenden Python; dasselbe ist in Java möglich, aber ich weiß nicht Syntax), so dass beim Aktualisieren eines Datensatzes überprüft wird, ob mehr als eine Stunde seit dem letzten Snapshot verstrichen ist, und wenn dies der Fall ist, wird ein Snapshot-Datensatz erstellt und geschrieben.

Um gleichzeitige Aktualisierungen zu verhindern, die zwei identische Snapshots erstellen, sollten Sie den Snapshots einen Schlüsselnamen geben, der von der Zeit stammt, zu der der Snapshot erstellt wurde. Wenn zwei gleichzeitige Updates versuchen, einen Snapshot zu schreiben, wird auf diese Weise der andere harmlos überschrieben.

Um den Snapshot für eine bestimmte Stunde zu erhalten, suchen Sie einfach nach dem ältesten Snapshot, der neuer als der angeforderte Zeitraum ist. Als zusätzlichen Bonus sparen Sie Speicherplatz, da inaktive Datensätze nicht gespeichert werden.

+0

+1, das wäre sicherlich effizienter. – Kiv

+0

guten Punkt, aber hier ist ein Szenario: Angenommen, die Anwendung simuliert einen Finanzmarkt. Jeder Benutzer hat ein Portfolio von Verträgen. Der Marktwert des Portfolios eines Nutzers ändert sich nicht nur, weil er handelt, sondern weil alle anderen handeln. Daher ist der aktuelle Wert des Benutzerportfolios nicht mit seinen Aktionen verknüpft. Was kann für diesen Fall getan werden? – shanyu

+2

Fair genug. In dieser Situation gehe ich davon aus, dass es keine Rolle spielt, wann der Snapshot tatsächlich ausgeführt wird. Sie können jedoch bei Bedarf Snapshots basierend auf historischen Daten generieren. In diesem Fall denke ich, dass es am besten ist, auf die Unterstützung für die Hintergrundverarbeitung zu warten, die auf der Roadmap steht. Cron-Jobs werden nicht ganz so funktionieren, wie Kiv es vorschlägt, da Sie nicht mehrere "winzige" Crons oder Crons mit einer Dauer von weniger als einer Minute haben können. Ich würde vorschlagen, die historischen Daten eines Benutzers auf erste Anfrage zu generieren und zu speichern, aber ich bin nicht überzeugt, dass Sie das schnell genug tun können - hängt davon ab, wie groß ihr Portfolio ist. –

0

Ich würde eine Kombination von Cron-Jobs und eine Looping-URL-Abrufmethode verwenden, die hier detailliert beschrieben wird: http://stage.vambenepe.com/archives/549. Auf diese Weise können Sie Ihre Timeouts abfangen und eine neue Anfrage starten.

Um den Artikel zusammenzufassen, ruft der Cron-Job Ihren anfänglichen Prozess auf, Sie fangen den Timeout-Fehler und rufen den Prozess erneut maskiert als zweite URL auf. Sie müssen zwischen zwei URLs pingen, damit die App-Engine nicht in einer zufälligen Schleife denkt. Sie müssen auch darauf achten, dass Sie nicht unendlich schleifen. Stellen Sie sicher, dass es einen Endstatus für Ihre Update-Schleife gibt, da dies Ihre Quotas ziemlich schnell überstürzen würde, wenn sie nie beendet würde.