3 Stimmen

Suche nach Mustern/Ansatz/Vorschlägen für den Umgang mit langlaufenden Vorgängen, die an eine Webanwendung gebunden sind

Ich arbeite an einer Consumer-Webanwendung, die einen lang laufenden Hintergrundprozess ausführen muss, der an jede Kundenanfrage gebunden ist. Mit lang laufen, meine ich irgendwo zwischen 1 und 3 Minuten.

Hier ist ein Beispiel für den Ablauf. Das Objekt/Widget ist nicht wirklich wichtig.

  1. Der Kunde kommt auf die Website und gibt das gesuchte Objekt/Widget an.
  2. Wir suchen/bereinigen/filtern nach Widgets, die einigen Anfangskriterien entsprechen. <-- langwieriger Prozess
  3. Der Kunde konfiguriert weitere Details über das gesuchte Widget.
  4. Wenn der langwierige Prozess abgeschlossen ist, kann der Kunde die letzten Schritte vor der Umstellung durchführen.

Die Schritte 3 und 4 sind nicht wirklich wichtig. Ich erwähne sie nur, weil wir damit etwas Zeit gewinnen können, während wir den langwierigen Prozess durchlaufen.

Die Umgebung, in der wir arbeiten, ist ein LAMP-Stack - derzeit mit PHP. Es scheint kein gutes Design zu sein, wenn ein lang laufender Prozess einen Apache-Thread in mod_php (oder einen Fastcgi-Prozess) in Anspruch nimmt. Die Apache-Schicht unserer Anwendung sollte auf die Bereitstellung von Inhalten und nicht auf die Datenverarbeitung konzentriert werden IMO.

Ein paar Fragen:

  1. Ist unsere Überlegung richtig, dass wir diesen "langlaufenden" Teil aus der Apache/Web-App-Schicht herauslösen sollten?
  2. Gibt es eine Standard/Typisch wie man das unter Linux/Apache/MySQL/PHP lösen kann (wir sind offen dafür, eine andere Sprache für die Verarbeitung zu verwenden, falls dies angemessen ist)?
  3. Irgendwelche Vorschläge, wie man es herausbekommen kann? Erstellen wir z.B. einen Deamon, der eine FIFO-Warteschlange durchläuft?

Edit: Nur zur Klarstellung: Nur etwa 1/4 des langwierigen Prozesses ist datenbankzentriert. Wir arbeiten daran, diesen Teil zu optimieren. Es gibt einige Arbeiten, die wir potenziell tun könnten, aber wir sind in der Menge, die wir im Moment tun können, begrenzt.

Danke!

1voto

tvanfosson Punkte 506878

Ziehen Sie in Erwägung, die Suchergebnisse über AJAX von einem Webdienst statt von Ihrer Anwendung bereitzustellen. Vermutlich könnten Sie dies auf einen anderen Server auslagern und Ihre Webanwendung nach Belieben mit dem Inhalt umgehen lassen.

Nur aus Neugier: 1-3 Minuten scheinen eine lange Zeit für eine Suchabfrage zu sein. Haben Sie nach Indizes für die Spalten gesucht, die Sie abfragen, um die Geschwindigkeit zu erhöhen? Oder müssen Sie einen algorithmischen Prozess durchführen - vielleicht könnten Sie einige dieser Abfragen offline durchführen und einige häufige Abfragen mit Hinweisen vorbereiten?

1voto

MarkR Punkte 60862

Wie von Jonnii vorgeschlagen, können Sie einen untergeordneten Prozess starten, der die Hintergrundverarbeitung durchführt. Dies muss jedoch mit einiger Vorsicht geschehen:

  • Stellen Sie sicher, dass alle übergebenen Parameter korrekt escaped werden
  • Sicherstellen, dass nicht mehr als eine Kopie des Prozesses gleichzeitig läuft

Wenn mehrere Kopien des Prozesses laufen, hält nichts einen (nicht einmal böswilligen, nur ungeduldigen) Benutzer davon ab, auf der Seite, die den Prozess auslöst, auf "Reload" zu drücken und schließlich so viele Kopien zu starten, dass dem Rechner der Speicherplatz ausgeht und er zum Stillstand kommt.

Sie können also einen Unterprozess verwenden, aber tun Sie es vorsichtig, auf kontrollierte Weise und testen Sie es richtig.

Eine andere Möglichkeit besteht darin, einen Daemon permanent laufen zu lassen, der auf Anfragen wartet, diese verarbeitet und die Ergebnisse dann irgendwo aufzeichnet (vielleicht in einer Datenbank)

0voto

jonnii Punkte 27657

Dies ist die Lösung für den armen Mann:

exec ("/usr/bin/php long_running_process.php > /dev/null &");

Alternativ können Sie auch:

  1. Fügen Sie in Ihre Datenbank eine Zeile mit den Einzelheiten der Hintergrundanforderung ein, die ein Daemon dann lesen und verarbeiten kann.

  2. Schreiben einer Nachricht in eine Nachrichtenwarteschlange, die dann von einem Daemon gelesen und verarbeitet wird.

0voto

S.Lott Punkte 371691

Hier ist eine Diskussion über die Java-Version dieses Problems.

Ver java: was sind die besten Techniken für die Kommunikation mit einem Batch-Server

Zwei wichtige Dinge, die Sie tun könnten:

  1. Wechseln Sie zu Java und verwenden Sie JMS.

  2. Informieren Sie sich über JMS, aber verwenden Sie einen anderen Warteschlangenmanager. Unix Named Pipes könnten zum Beispiel eine akzeptable Implementierung sein.

0voto

Bruno De Fraine Punkte 42481

Java-Servlets können Hintergrundverarbeitung . Sie könnten etwas Ähnliches wie diese Technologie in einer Web-Technologie mit Threading-Unterstützung tun. Ich weiß allerdings nicht, wie es mit PHP aussieht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X