Es kommt in der Entwicklungsabteilung von ZEIT ONLINE leider nicht sehr oft vor, dass wir ein Modul von allgemeinem Nutzen entwickeln. Um so mehr freuen wir uns, wenn wir einmal die Gelegenheit haben, der Open-Source-Community etwas zurückzugeben, von der wir selbst so sehr profitieren.
Unsere interne asynchrone Taskverarbeitung haben wir in den letzten Wochen komplett überarbeitet und auf Celery umgestellt. Ein Task ist bei uns zum Beispiel die Veröffentlichung eines Artikels. Ein Redakteur klickt auf Veröffentlichung, der Task wird über einen Broker eingestellt und möglichst schnell abgearbeitet. In dieser Zeit kann der Redakteur weiterarbeiten oder auf die Veröffentlichung warten – besonders lange dauert es nicht.
Ein besonderes Feature der Veröffentlichung in unserem CMS ist die automatische Veröffentlichung zu einem bestimmten Zeitpunkt. Nun bietet Celery sogar einige zeitabhängige Konzepte an. Man kann beispielsweise eine bestimmte Aufgabe mit einem Countdown versehen. Allerdings lässt sich ein solcher Task nicht mehr abbrechen. Und die sogenannten Celery-Beats sind eher für periodische Aufgaben gedacht. Unser konkretes Problem könnte man also ganz ohne Celery lösen, indem man es in die Anwendung verlagert und sich dort merkt, wann man einen bestimmten Artikel veröffentlichen möchte.
Wir hatten da eine etwas andere und – wie wir hoffen – allgemeinere Idee. Mit unserem Longterm Scheduler ist es möglich, die Aufgabe direkt als Celery-Task in ein dafür vorgesehenes Backend zu schreiben. Dafür muss Celery mit einer erweiterten Task-Klasse konfiguriert werden. Soll eine Aufgabe anschließend zu einem bestimmten Zeitpunkt ausgeführt werden, muss man diesen Zeitpunkt bei der Einstellung zusätzlich übergeben. Mit einem Cronjob wird das Backend anschließend regelmäßig überprüft und ein Task wird als regulärer Celery-Task eingereiht und abgearbeitet, wenn das Fälligkeitsdatum erreicht ist.
Vielleicht findet jemand dies genauso nützlich wie wir. Unser Ansatz ist noch etwas konkreter und entwicklerfreundlicher auf unserer Github-Seite beschrieben. Das Python-Paket befindet sich auf Python Package Index. Bisher unterstützen wir Redis, da wir dieses Backend auch als Broker benutzen. Über Pull-Request zur Unterstützung anderer Backends würden wir uns freuen.