2009-06-22 10 views
48

Die neueste Google App Engine-Version unterstützt eine neue Task Queue API in Python. Ich habe die Fähigkeiten dieser API mit der bereits bestehenden Cron service verglichen. Für Hintergrundjobs, die nicht vom Benutzer initiiert wurden, z. B. das Abrufen eines RSS-Feeds und das Parsen in einem täglichen Intervall. Kann und sollte die Task Queue API für nicht benutzerinitiierte Anfragen wie diese verwendet werden?Google App Engine - Aufgabenwarteschlangen vs Cron-Jobs

Antwort

24

Ich würde sagen "irgendwie". Die Dinge, die man sich über Task-Queues merken sollte sind:

1) Ein Limit von Operationen pro Minute/Stunde/Tag ist nicht das gleiche wie etwas in regelmäßigen Abständen zu wiederholen. Selbst wenn die Token-Bucket-Größe auf 1 gesetzt ist, glaube ich nicht, dass diese Wiederholungen gleichmäßig verteilt sind. Es hängt davon ab, wie ernst sie sind, wenn sie sagen, dass die Warteschlange als Token-Bucket implementiert ist und ob diese Anweisung ein garantierter Teil der Schnittstelle sein soll. Da es sich um Labs handelt, ist noch nichts garantiert.

2) Wenn eine Aufgabe fehlschlägt, wird sie erneut angefordert. Wenn ein Cron-Job fehlschlägt, wird er protokolliert und nicht wiederholt, bis er erneut fällig ist. Ein Cron-Job verhält sich also nicht genauso wie eine Aufgabe, die eine Kopie von sich selbst hinzufügt und dann Ihren Feed aktualisiert, oder als eine Aufgabe, die Ihren Feed aktualisiert und dann eine Kopie von sich selbst hinzufügt.

Es kann durchaus möglich sein, Cron-Jobs mithilfe von Aufgaben nachzubilden, aber ich bezweifle, dass es das wert ist. Wenn Sie versuchen, einen Cron-Job zu umgehen, der mehr als 30 Sekunden zum Ausführen benötigt (oder ein beliebiges anderes Anforderungslimit erreicht), können Sie die Arbeit in Teile aufteilen und einen Cron-Job erstellen, der alle Teile zu a hinzufügt Aufgabenwarteschlange Es gab einige Gespräche (im GAE-Blog?) Über asynchrone Urlfetch, die die ultimative beste Art der Aktualisierung von RSS-Feeds sein könnten.

+1

async urlfetch heute existiert, siehe http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html - aber ich bin nicht sicher, wie es wäre der ultimative beste Weg zur Aktualisierung von RSS-Feeds; hast du vielleicht noch etwas anderes vor? –

+1

Aus irgendeinem Grund erwartete ich etwas, das eine URL zurückrufen würde, wenn die abgerufenen Daten eintrafen. Nicht sicher, wo ich diese Idee herbekommen habe, vielleicht meine Vorstellungskraft. Wenn Sie jedoch viele RSS-Feeds aktualisieren, müssen die HTTP-Anforderungen irgendwie parallel sein, und Taskwarteschlangen allein erlauben nur so viele gleichzeitige Instanzen. Möglicherweise führt die API, auf die Sie verweisen, die Aufgabe bereits durch. –

+4

wert hinzuzufügen, dass Sie auch einen Cron-Job verwenden können, um die Aufgabenwarteschlange zu füllen/verwalten, so dass Sie beide Möglichkeiten haben können. –

5

Die Art, wie ich es ansehe, ist, dass wenn ich nur einen RSS-Feed analysiere, ein Cron-Job gut genug wäre. Wenn ich die X-Anzahl von RSS-Feeds analysieren muss, die zur Laufzeit von einem Benutzer oder einer anderen Systemvariablen angegeben wurden, dann würde ich jedes Mal Aufgaben auswählen.

Ich sage das nur, weil ich in der Vergangenheit viele benutzerdefinierte Twitter-Suchen in regelmäßigen Abständen ausführen musste und mit Cron-Jobs endete ich ein sehr schlechtes Queuing-System, um die Anforderungen auszuführen, die ausgeführt werden mussten - es didn ' t skalieren, hat es nicht geholfen, und das kleinste Intervall, das ein Cron-Job sein kann, ist nur 1 Minute (ich hatte mehr Suchen durchzuführen als Minuten am Tag).

Die coole Sache über Aufgaben ist, dass Sie ihnen eine ETA geben können, also können Sie sagen, dass ich möchte, dass es in Zukunft 47 Sekunden ausgeführt wird, oder ich möchte, dass es um 12:30 ausgeführt wird.