Frage

Ich habe eine Web-Anwendung Pylone serviert von Apache (mod_wsgi, prefork). Wegen der Apache gibt es mehrere separate Prozesse laufen meine Anwendungscode gleichzeitig. Einige der nicht-kritischen Aufgaben, dass die Anwendung tut ich für die Verarbeitung im Hintergrund verschieben will „live“ Reaktionszeiten zu verbessern. Also habe ich von Task-Warteschlange denke, aus der Warteschlange viele Apache-Prozesse Hinzufügen Aufgaben zu dieser Warteschlange ein einzelner separater Python-Prozess verarbeitet ihnen one-by-one und zu entfernen.

Die Warteschlange soll vorzugsweise auf der Festplatte beibehalten werden, so die Warteschlange nicht verarbeiteten Aufgaben wegen Stromausfall nicht verloren gehen, Server-Neustart usw. Die Frage ist was wäre eine vernünftige Art und Weise sein, wie Warteschlange zu implementieren ?

Wie für die Dinge, die ich versucht habe: ich mit einfacher SQLite-Datenbank und einzelner Tabelle zum Speichern von Warteschlangenelementen darin gestartet. In Belastungstests, wenn Niveau der Parallelität zu erhöhen, begann ich immer „Datenbank gesperrt“ Fehler, wie erwartet. Die quick'n'dirty fix war SQLite mit MySQL zu ersetzen - es Concurrency Probleme gut behandelt fühlt sich aber wie ein Overkill für die einfache Sache, die ich tun müssen. Queue bezogenen DB-Operationen auch prominent in meinem Profil Berichten zeigen.

War es hilfreich?

Lösung

Ein Nachrichten-Broker wie Apache ActiveMQ ist eine ideale Lösung.

Die Pipeline folgende werden:

  • Anwendungsprozess, der für den Umgang mit HTTP verantwortlich fordert Antworten schnell erzeugt und sendet mit niedriger Priorität, schwere Aufgaben zu AMQ Warteschlange.
  • Eine oder mehrere werden weitere Prozesse abonnieren AMQ Warteschlange zu konsumieren und tun, was beabsichtigt ist, mit diesen schweren Aufgaben zu tun.

Das Erfordernis der Warteschlange Persistenz, da Nachrichten ActiveMQ speichert der Box erfüllt, die nicht noch in persistenten Speicher verbraucht werden. Zudem skaliert es ganz gut, da Sie kostenlos jeweils mehrere HTTP-Anwendungen, mehrere Consumer-Anwendungen und AMQ sich auf verschiedenen Maschinen zu implementieren.

Wir verwenden so etwas in unserem Projekt in Python geschrieben unter Verwendung von STOMP als zugrunde liegende Kommunikationsprotokoll .

Andere Tipps

Ein Web-Server (beliebiger Web-Server) ist Multi-Produzent, Single-Consumer-Prozess.

Eine einfache Lösung ist zu bauen, ein wsgiref oder Werkzeug Backend-Server Back-End-Anforderungen zu verarbeiten.

Da dieser "Back-End" Server Build WSGI-Technologie, es ist sehr, sehr ähnlich wie der Front-End-Web-Server. Außer. Es produziert keine HTML-Antworten (JSON ist in der Regel einfacher). Other than that, es ist sehr einfach.

Sie entwerfen RESTful-Transaktionen für dieses Backend. Sie verwenden alle die verschiedenen WSGI Funktionen für die URI Parsing, Autorisierung, Authentifizierung, etc. Sie - in der Regel - nicht Session-Management benötigen, da RESTful-Server in der Regel keine Sitzungen bieten.

Wenn Sie in ernsthafte Skalierbarkeitsprobleme bekommen, können Sie einfach wickeln Sie Ihre Backend-Server in lighttpd oder einem anderen Web-Engine ein Multi-Threaded-Backend zu erstellen.

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