Asynchrone Dateispeicherung von Benutzeruploads
Verfasst: Samstag 7. August 2010, 11:28
Hallo zusammen,
ich bastle derzeit an einer Speicherlösung für Dateien, die ein User auf einer Website hochgeladen hat. Für die endgültige Speicherung möchte ich GridFS, statt des normalen Dateisystems verwenden. Wurde die Datei erfolgreich im GridFS gespeichert, wird eine ID zurückgeliefert, die ich für die Identifikation der Datei verwende.
Funktionieren tut das wie folgt:
Der Benutzer lädt die Datei hoch, diese wird wie üblich ins tmp-Verzeichnis gespeichert, anschließend wird die Datei im selben Request-Aufruf ins GridFS gespeichert.
Mein Problem bei der Sache dabei ist jetzt folgende:
Synchron (wie oben beschrieben) funktioniert das alles ganz gut, jedoch auf einem Testsystem ohne Last. Würden jetzt mehrere Benutzer parallel Dateien hochladen, könnte es zu Geschwindigkeitsproblem bzw. Verzögerungen kommen, die Dateien vom tmp-Verzeichnis ins GridFS zu bekommen. Das heißt der Benutzer muss solange warten, bis die Datei endgültig im GridFS angekommen ist, erst dann wird die Erfolgsmeldung zurückgegeben. Problem ist, der Benutzer muss warten und glaubt vielleicht das irgendetwas nicht ordentlich funktioniert hat und startet evtl. den Upload nochmal.
Jetzt meine Frage, wie könnte ich das Speichern der Datei ins GridFS soweit entkoppeln, das der Benutzer gleich nach dem Upload (ins tmp-Verzeichnis) eine Erfolgsmeldung bekommt und der Speicherungsprozess ins GridFS im Hintergrund weiter läuft. Eine Lösung mit einem Thread der gestartet wird um die Datei ins GridFS zu laden erscheint mir auch nicht als die beste Möglichkeit. Auch eine Entkopplung mit einem Messagequeue ist meines Erachtens nicht sinnvoll möglich. Eine AJAX-Lösung, wo alles beim User im Browser abläuft gefällt mir auch nicht sonderlich, weil man nicht garantieren kann, das alles 100%ig funktioniert.
Wie lösen das große Seiten wie scribd.com, tumblr.com oder facebook usw. wo viele Benutzer gleichzeitig Dateien hochladen? Einfach nur performante Storagesysteme, die ins System eingemountet sind? Facebook hat das jedenfalls anfangs so gemacht. Habt ihr eine Idee dazu das ganze zu entkoppeln?
Danke euch....
ich bastle derzeit an einer Speicherlösung für Dateien, die ein User auf einer Website hochgeladen hat. Für die endgültige Speicherung möchte ich GridFS, statt des normalen Dateisystems verwenden. Wurde die Datei erfolgreich im GridFS gespeichert, wird eine ID zurückgeliefert, die ich für die Identifikation der Datei verwende.
Funktionieren tut das wie folgt:
Code: Alles auswählen
[Upload] => [tmp-Verzeichnis] => [GridFS]
Mein Problem bei der Sache dabei ist jetzt folgende:
Synchron (wie oben beschrieben) funktioniert das alles ganz gut, jedoch auf einem Testsystem ohne Last. Würden jetzt mehrere Benutzer parallel Dateien hochladen, könnte es zu Geschwindigkeitsproblem bzw. Verzögerungen kommen, die Dateien vom tmp-Verzeichnis ins GridFS zu bekommen. Das heißt der Benutzer muss solange warten, bis die Datei endgültig im GridFS angekommen ist, erst dann wird die Erfolgsmeldung zurückgegeben. Problem ist, der Benutzer muss warten und glaubt vielleicht das irgendetwas nicht ordentlich funktioniert hat und startet evtl. den Upload nochmal.
Jetzt meine Frage, wie könnte ich das Speichern der Datei ins GridFS soweit entkoppeln, das der Benutzer gleich nach dem Upload (ins tmp-Verzeichnis) eine Erfolgsmeldung bekommt und der Speicherungsprozess ins GridFS im Hintergrund weiter läuft. Eine Lösung mit einem Thread der gestartet wird um die Datei ins GridFS zu laden erscheint mir auch nicht als die beste Möglichkeit. Auch eine Entkopplung mit einem Messagequeue ist meines Erachtens nicht sinnvoll möglich. Eine AJAX-Lösung, wo alles beim User im Browser abläuft gefällt mir auch nicht sonderlich, weil man nicht garantieren kann, das alles 100%ig funktioniert.
Wie lösen das große Seiten wie scribd.com, tumblr.com oder facebook usw. wo viele Benutzer gleichzeitig Dateien hochladen? Einfach nur performante Storagesysteme, die ins System eingemountet sind? Facebook hat das jedenfalls anfangs so gemacht. Habt ihr eine Idee dazu das ganze zu entkoppeln?
Danke euch....