Ich arbeite an einer Django-Anwendung, die es einem Benutzer ermöglicht, Dateien hochzuladen. Ich muss einige serverseitige Verarbeitung für diese Dateien durchführen, bevor Sie sie an Amazon S3 senden. Nach dem Lesen der Antworten auf this question und this blog post entschied ich, dass die beste Art und Weise, um dies zu behandeln ist, meine View-Handler eine Methode auf Pyro Remote-Objekt aufrufen, um die Verarbeitung asynchron durchzuführen und dann sofort eine HTTP 200 an den Client zurückgeben. Ich habe diesen Prototyp und es scheint gut zu funktionieren, jedoch möchte ich auch den Status der Verarbeitung speichern, so dass der Client die Anwendung abfragen kann, um zu sehen, ob die Datei verarbeitet und auf S3 hochgeladen wurde.Wie sollte ich den Status für einen lang andauernden Prozess speichern, der von Django aufgerufen wird?
Ich kann die Abfrage einfach genug handhaben, aber ich bin nicht sicher, wo der entsprechende Speicherort den Prozessstatus speichern soll. Es muss durch den Pyro-Prozess beschreibbar und in meiner Abfrageansicht lesbar sein.
Natürlich gibt es auch einige Bedenken hinsichtlich der Datenintegrität beim Entkoppeln des Zustands von der Datenbank (was passiert, wenn der Server ausfällt und alle diese Daten im Speicher sind?). Ich bin zu hören, wie erfahrenere Webanwendungsentwickler mit dieser Art von Stateful Processing umgehen würden.
Nachdem ich über Nacht darüber nachgedacht habe, habe ich entschieden, dass Sie absolut Recht haben. Es macht einfach keinen Sinn, die Datenbank nicht zu benutzen. Ich habe auch entschieden, dass Pyro hier schlecht passt und dass ich einfach tun sollte, was normale Leute machen und einen Cron-Job mit einer Sperrdatei verwenden. – bouvard
Wir verwenden nicht Cron. Wir haben unser Batch-System als kleinen WSGI-Server und wir machen eine HTTP-Anfrage mit urllib2, um es zu wecken. Er erhält die Request-ID von der WSGI-Anfrage; bekommt die Details mit gewöhnlichem Django ORM. –
Das ist etwas, was ich mit Pyro geplant habe, aber das Problem, das ich vorhersehe, ist, dass ein plötzlicher Serverausfall die Dokumente zur Hälfte verarbeitete und es keine neue Anforderungsnachricht geben würde, um die Verarbeitung erneut zu initiieren. Wenn ich einen Cron-Job verwende, weiß ich, dass ich einfach die alten 10 unfertigen Jobs aus der Anfrage-Tabelle auswählen kann, und ich werde jeden abholen, der während des Ausfalls abgeschnitten wurde. – bouvard