13

Ich erstelle eine Anwendung, die große Mengen von Foto-Uploads auf einmal ermöglicht, und wollte wissen, was das beste Setup wäre, um dies anzugehen.Beste Ruby on Rails-Architektur für Image Heavy App

Das ist, was ich bisher bin mit:

  • JQuery Datei-Upload: ermöglicht es Benutzern, Bilder
  • CarrierWave per Drag & Drop: Verarbeitet Bilder und passt die Größe sie mit ImageMagick
  • Amazon S3: CarrierWave Uploads Bilder, die auf Amazon S3 durch Nebel
  • Heroku:

Ich mag würde die Benutzer erlauben zu sein für das Hosting Sie können eine große Anzahl von Bildern auf eine Seite ziehen und dann zu anderen Seiten navigieren, während der Upload im Hintergrund läuft. Ich möchte auch, dass Bilder nach dem Hochladen angezeigt werden. Ich möchte nicht, dass dieser Prozess die Heroku-Dynos blockiert, also muss ich die Arbeit wahrscheinlich in einen Hintergrundjob verschieben, aber ich bin mir nicht sicher, was ich für meine Situation verwenden soll.

Was ist das beste Setup für diese Art von App? Welchen Hintergrundarbeiter Edelstein sollte ich verwenden? Ist Cloudinary eine gute Idee?

+0

Upload-Modul für Webserver hinzufügen, um unnötige CPU-Auslastung zu vermeiden. Dateikopie – Viren

Antwort

34

Ich habe vor kurzem eine Anwendung erstellt, die eine große Anzahl von Uploads auf Heroku akzeptiert. Ich entschied mich, meine eigene Lösung zu erstellen, anstatt Cloudinary oder ein Äquivalent zu verwenden. Hier sind einige Lektionen, die ich gelernt habe:

  • Nicht auf Heroku hochladen. Ihr gesamter Web-Mitarbeiter wird für die gesamte Dauer des Uploads gesperrt. Das ist bis zu einer Minute. Inakzeptabel.

  • Verwenden Sie einen Javascript-Uploader (wie jquery-file-upload), um direkt auf s3 hochzuladen. Das ist zunächst ein wenig kompliziert, aber wenn man es erst einmal funktioniert, ist es fantastisch.Sie können das s3_direct_upload Juwel verwenden, oder Sie können einfach ihre Quelle lesen, um Ihre eigene Lösung von Grund auf neu zu erstellen. Dieses Juwel basierte auf einer railscasts pro Episode, für die Sie zahlen müssen, aber source available hat.

  • Wenn der Upload abgeschlossen ist, erstellen Sie eine AJAX-Anforderung an Ihre Anwendung und übergeben Sie die neue s3-URL als remote url. Carrierwave verarbeitet dann das Bild auf s3 wie es hochgeladen wurde, außer in nur ein paar Sekunden statt bis zu einer Minute.

  • Verwenden Sie jquery-file-uploads client-side image resizing. Jemand wird versuchen, ein 5MB Foto hochzuladen und dann zu meckern, dass der Upload ewig dauert. Dadurch werden alle Uploads so schnell wie möglich möglich.

  • Konfigurieren Sie s3 zu clear your uploads folder automatically.

  • Verwenden Sie nicht dünn. Verwenden Sie unicorn. Ein paar Sekunden sind zu lang, um eine Anfrage auf dünn zu bearbeiten, aber ein Einhorn mit drei oder vier Arbeitern ist viel verzeihender.

  • Verwenden Sie nicht rmagick. Es ist eine bessere API für komplexe Bildmanipulation, verwendet aber erstaunlich viel Speicher. Verwenden Sie stattdessen mini_magick.

Sie werden feststellen, dass ich keinen Hintergrundarbeiter für das alles verwenden. Wenn Sie sich wirklich akribisch fühlen, könnte der Controller, der die Remote - URL empfängt, seine Arbeit an einen Hintergrund - Worker weitergeben. Wenn Sie das Ergebnis sofort benötigen, könnte der Hintergrund - Worker die Benutzeroberfläche durch pubsub (faye oder pusher) benachrichtigen aufregende neue sync Edelstein). Aber das war nicht notwendig für meine Bewerbung, und ich würde mein Geld lieber für einen anderen Web-Dyno als für einen Arbeiter-Dyno ausgeben.

Und yeah, wenn Sie möchten, dass sie während des Vorgangs auf Ihre gesamte Anwendung klicken, müssen Sie entweder ein Popup hochladen (und eine Art Pubsub-Lösung verwenden) oder Ihr gesamtes erstellen Website als Javascript-Anwendung mit Ember oder Backbone oder eckig oder was auch immer.

Haben Sie Fragen?

+0

Es gibt Probleme mit der Reaktionszeit bei der Verarbeitung, auch nur für ein paar Sekunden, auf einem Web-Dyno. Der Lastausgleichsschicht von Heroku ist nicht mehr bewusst, ob jeder Prüfpunkt tatsächlich verfügbar ist, um eine Anfrage zu bearbeiten oder nicht. Anforderungen werden nach dem Zufallsprinzip auf alle Dynos verteilt. Anfragen anderer Benutzer warten möglicherweise 3-5 Sekunden lang auf Ihren Bildverarbeitungsanfragejob, obwohl ein anderer Dynode die Anfrage sofort bearbeiten könnte. Es ist immer am besten, Anfragen schnell über Heroku zu halten. [Quellartikel] (http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics) –

+1

Einverstanden. Deshalb hat heroku [ihre offizielle Empfehlung geändert] (https://blog.heroku.com/archives/2013/2/27/unicorn_rails) von dünn zu Einhorn, wo das Problem viel weniger ausgeprägt ist. Die bestmögliche Architektur beinhaltet die Arbeiter, aber es ist vielleicht nicht für alle Anwendungen notwendig und wird sicherlich nicht die gleiche Wirkung haben, wie zum Beispiel direkte s3-Uploads. – Taavo

6

Ich hätte Cloudinary nie zuvor gesehen, aber es scheint, als wäre es eine großartige Ergänzung für Ihr Projekt.

In erster Linie könnte es Ihre App erheblich vereinfachen. Cloudinary unterstützt direct uploads from the browser über seine HTTP-API, und es gibt bereits eine jquery plugin dafür, die auf jQuery File Upload basiert und ähnliche Funktionen hat, einschließlich der clientseitigen Pre-Upload-Verarbeitung.

Darüber hinaus unterstützt es On-the-Fly-Transformationen ähnlich dragonfly (auch eine sehr nette lib).

Dies bedeutet, dass Sie, wenn Sie diese Bilder nicht wirklich über Ihre App hochladen müssen, diese vollständig umgehen können, indem Sie sie direkt zu Cloudify hochladen und Bildbeschneidung und andere Transformationen über ihre transformation API bearbeiten.

Sie können Carrierwave und S3 bei Bedarf aus Ihrer App entfernen, und es ist natürlich nicht notwendig, Hintergrund-Dynos für die Bildverarbeitung zu verwenden. Darüber hinaus wäre es wahrscheinlich viel schneller (direktes Hochladen und direkte Änderungen im Vergleich zum Hochladen in Ihre App, Verarbeiten und Hochladen in die Cloud) und würde die Bandbreite für das Hochladen über Ihre App verringern.

Auch ohne direkten Upload scheint es, dass Cloudinary ein Carrierwave-Plugin zur Verfügung stellt, das immer noch ihre Transformations-API nutzen kann, so dass Ihre App keine Bilder verarbeiten muss.

+0

Ermöglicht es Benutzern, eine Gruppe von Fotos zu posten, die dann im Hintergrund hochgeladen werden (damit sie die Seite verlassen können, ohne den Uploadvorgang zu stoppen)) –

+0

Ich sehe das nicht, ohne ein Popup-Fenster für den Upload zu öffnen. Andernfalls wird der Upload beim Verlassen der Seite unterbrochen. Es gibt keine Hintergründe von Prozessen in einem Webbrowser, den ich kenne. – numbers1311407

+0

Je nach dem, was Sie tun, können Sie dem Stack dennoch eine Art Push-Komponente hinzufügen, z. B. Faye oder eine WebSocket-Implementierung, mit der Sie Benachrichtigungen für hochgeladene Bilder pushen können. – numbers1311407