Frage

Ich arbeite an einer Django-Anwendung, die ein Benutzer Dateien hochladen kann. Ich brauche eine serverseitige Verarbeitung für diese Dateien ausführen, bevor sie an Amazon S3 senden. Nachdem die Antworten zu lesen, diese Frage und diese Blog-Post entschied ich mich, dass die beste Art und Weise, dies zu handhaben ist meine Ansicht Handler invoke hat Verfahren Pyro entferntes Objekt asynchron die Verarbeitung durchzuführen und dann sofort eine Http 200 an den Client zurück. Ich habe diese prototypische und es scheint gut zu funktionieren, aber ich würde auch den Zustand der Verarbeitung speichern möge, so dass der Kunde die Anwendung abfragen kann, um zu sehen, ob die Datei hochgeladen und bis S3 verarbeitet wurde.

Ich kann die Abfrage behandeln leicht genug, aber ich bin nicht sicher, wo der geeignete Ort ist, den Prozesszustand zu speichern. Es muss durch den Pyro Prozess und lesbar durch meine Wahl Ansicht beschreibbar sein.

  • Ich bin zögerlich Spalten für Daten in die Datenbank hinzuzufügen, die eigentlich nur für 30 bis 60 Sekunden andauern sollte.
  • Ich habe Djangos niedrigen rel="nofollow -Level-Cache API und eine Datei-ID als Schlüssel, aber ich glaube das nicht wirklich das, was der Cache-Rahmen für das konzipiert ist, und ich bin nicht sicher, welche unvorhergesehenen Probleme es mit diesem Weg gehen könnte .
  • Schließlich habe ich als Zustand, in dem Pyro-Objekt speicherte die Verarbeitung zu tun, aber dann scheint es nach wie vor, wie ich ein boolean „processing_complete“ Datenbankspalte hinzufügen müssen würde, so dass der Blick weiß, ob oder nicht Staat vom Pyro abfragen Objekt.

Natürlich gibt es auch einige Datenintegrität Bedenken Zustand aus der Datenbank mit Entkopplung (was passiert, wenn der Server ausfällt und alle diese Daten im Speicher?). Ich bin zu hören, wie reifere Web-Entwickler würden diese Art von Stateful Verarbeitung handhaben.

War es hilfreich?

Lösung

Wir tun dies durch eine "Request" Tabelle in der Datenbank hat.

Wenn der Upload ankommt, schaffen wir das hochgeladene Datei-Objekt, und eine Anfrage erstellen.

Wir beginnen den Hintergrund Batch-Prozessor.

Wir kehren ein 200 „wir arbeiten daran“ Seite -. Es zeigt die Anfragen und deren Status

Unser Batch-Prozessor verwendet die Django ORM. Wenn es fertig ist, aktualisiert er das Request-Objekt. Wir können (aber nicht) eine E-Mail-Benachrichtigung senden. Meistens wir nur den Status aktualisieren, so dass der Benutzer immer, dass die Verarbeitung abgeschlossen hat sehen anmelden können.


Batch Server-Architektur Notizen.

Es ist ein WSGI-Server, der für eine Stapelverarbeitungsanforderung an einem Port wartet. Die Anforderung ist eine REST POST mit einer ID-Nummer; der Batch-Prozessor sieht dies in der Datenbank und verarbeitet es.

Der Server gestartet wird automatisch durch unsere REST-Schnittstelle. Wenn es nicht läuft, können wir es laichen. Dies macht eine Transaktion Benutzer erscheint langsam, aber, na ja. Es ist nicht zum Absturz bringen soll.

Auch wir haben eine einfache crontab zu überprüfen, dass es läuft. Allenfalls wird es für 30 Minuten nach unten zwischen „Bist du am Leben?“ Schecks. Wir haben keine formale Startskript (wir laufen unter Apache mit mod_wsgi), aber wir können einen „Neustart“ Skript erstellen, das die WSGI Datei berührt und tut dann einen POST an eine URL, die einen Gesundheitscheck macht (und startet die Batch-Prozessor).

Wenn der Batch-Server gestartet wird, kann es nicht verarbeitete Anfragen, für die es nie eine POST bekommen hat. So ist der Standard-Start alle Arbeiten aus der Anforderungswarteschlange zu ziehen - vorausgesetzt, es ist etwas verpaßt hat.

Andere Tipps

Ich weiß, das ist eine alte Frage, aber jemand kann meine Antwort nützlich, auch nach all dieser Zeit, so hier geht.

Sie können natürlich Verwendung Datenbank als Warteschlange, aber es gibt Lösungen entwickelt, genau für diesen Zweck.

AMQP gemacht wird nur dafür. Zusammen mit Sellerie oder Carrot und ein Broker-Server wie RabbitMQ oder ZeroMQ .

Das ist, was wir in unserem aktuellen Projekt verwenden und es funktioniert super.

Für Ihr Problem Sellerie und RabbitMQ scheint wie eine beste Passform. RabbitMQ bietet persistency Ihre Nachrichten und Sellerie macht einfach Ansichten zur Abfrage des Status der Prozesse parallel laufen zu überprüfen.

Sie können auch daran interessiert sein octopy .

Also, es ist eine Job-Warteschlange, die Sie benötigen. Für Ihren Fall würde ich absolut mit der DB geht Zustand zu speichern, auch wenn diese Staaten kurzlebig sind. Es klingt wie das alle Ihre Anforderungen erfüllen, und ist nicht sehr schwierig zu implementieren, da Sie bereits alle beweglichen Teile gibt, für Sie da. Halten Sie es einfach, wenn Sie Notwendigkeit etwas komplexer.

Wenn Sie etwas stärker oder anspruchsvollere brauchen, ich auf etwas aussehen würde wie Gearman .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top