Ich schreibe eine recht komplexe Webanwendung. Das Python-Backend führt einen Algorithmus aus, dessen Zustand von Daten abhängt, die in mehreren miteinander verknüpften Datenbanktabellen gespeichert sind und sich nicht oft ändern, sowie von benutzerspezifischen Daten, die sich oft ändern. Der Zustand des Algorithmus pro Benutzer unterliegt vielen kleinen Änderungen, während ein Benutzer mit der Anwendung arbeitet. Dieser Algorithmus wird während der Arbeit eines jeden Benutzers häufig verwendet, um bestimmte wichtige Entscheidungen zu treffen.
Aus Leistungsgründen ist eine Neuinitialisierung des Zustands bei jeder Anfrage aus den (halbnormalisierten) Datenbankdaten schnell nicht mehr praktikabel. Besser wäre es, das Python-Objekt des Zustands auf irgendeine Weise zwischenzuspeichern, damit es bei Bedarf einfach verwendet und/oder aktualisiert werden kann. Da es sich jedoch um eine Webanwendung handelt, gibt es mehrere Prozesse, die Anfragen bearbeiten, so dass die Verwendung einer globalen Variablen nicht in Frage kommt.
Ich habe versucht, das relevante Objekt (über Pickle) zu serialisieren und die serialisierten Daten in der DB zu speichern, und experimentiere jetzt mit der Zwischenspeicherung der serialisierten Daten über Memcached. Dies hat jedoch immer noch den erheblichen Overhead der Serialisierung und Deserialisierung des Objekts oft.
Ich habe mir Lösungen mit gemeinsamem Speicher angesehen, aber das einzige, was ich gefunden habe, ist POSH . POSH scheint jedoch nicht weit verbreitet zu sein, und es fällt mir nicht leicht, eine solche experimentelle Komponente in meine Anwendung zu integrieren.
Ich brauche einen Rat! Dies ist mein erster Versuch, eine Webanwendung zu entwickeln, also hoffe ich, dass dieses Problem so häufig auftritt, dass es bekannte Lösungen für solche Probleme gibt. An diesem Punkt Lösungen, die davon ausgehen, dass die Python-Back-End auf einem einzigen Server ausgeführt wird, wäre ausreichend, aber Extrapunkte für Lösungen, die auf mehrere Server als auch skalieren :)
Anmerkungen:
- Ich habe diese Anwendung in Betrieb, derzeit live und mit aktiven Benutzern. Zu Beginn habe ich keine vorzeitige Optimierung vorgenommen und dann nach Bedarf optimiert. Ich habe Messungen und Tests durchgeführt, um sicherzustellen, dass das oben genannte Problem der eigentliche Engpass ist. Ich bin mir ziemlich sicher, dass ich mehr Leistung aus dem aktuellen Setup herausholen könnte, aber ich wollte fragen, ob es einen besseren Weg gibt.
- Die Einrichtung selbst ist noch nicht abgeschlossen; gehen Sie davon aus, dass die Architektur des Systems so gestaltet werden kann, wie es Ihrer Lösung entspricht.