2013-05-25 50 views
35

Sono interessato a comprendere i diversi approcci alla gestione di caricamenti di file di grandi dimensioni in un'applicazione Rails, file 2-5 GB.Qual è l'approccio migliore per gestire i caricamenti di file di grandi dimensioni in un'app per rails?

Capisco che per trasferire un file di queste dimensioni sarà necessario suddividerlo in parti più piccole, ho fatto delle ricerche e qui è quello che ho finora.

  • La configurazione sul lato server è necessaria per accettare richieste POST di grandi dimensioni e probabilmente una macchina a 64 bit per gestire anything over 4Gb.
  • AWS sostiene multipart upload.
  • HTML5 FileSystemAPI ha un uploader persistente che carica il file in blocchi.
  • Una biblioteca per Bitorrent anche se questo richiede un client di trasmissione che non è l'ideale

Possono tutti questi metodi essere ripreso come FTP, il motivo per cui non voglio usare FTP è che voglio tenere in web app se questo è possibile? Ho usato carrierwave e paperclip ma sto cercando qualcosa che possa essere ripreso poichè caricare un file da 5Gb potrebbe richiedere del tempo!

Di questi approcci che ho elencato mi piacerebbe capire cosa ha funzionato bene e se ci sono altri approcci che potrei mancare? Nessun plug-in se possibile, preferirebbe non utilizzare Java Applet o Flash. Un'altra preoccupazione è che queste soluzioni mantengono il file in memoria durante il caricamento, che è anche un vincolo che preferirei evitare se possibile.

risposta

34

Ho affrontato questo problema su diversi siti, utilizzando alcune delle tecniche che hai illustrato sopra e alcune che non hai. La buona notizia è che in realtà è piuttosto realistico consentire caricamenti massicci.

Gran parte di ciò dipende da cosa si intende effettivamente fare con il file dopo averlo caricato ... Più lavoro si deve fare sul file, più lo si vorrà vicino al server. Se devi eseguire l'elaborazione immediata sul caricamento, probabilmente vuoi fare una soluzione di puro binario. Se non hai bisogno di eseguire alcuna elaborazione, o non è un fattore critico del tempo, puoi iniziare a considerare soluzioni "ibride" ...

Credici o meno, in realtà ho avuto abbastanza fortuna usando solo mod_porter. Mod_porter fa fare a Apache un po 'del lavoro che la tua app normalmente farebbe. Aiuta non legare una discussione e un mucchio di memoria durante il caricamento. Risulta in un file locale per la tua app, per una facile elaborazione. Se si presta attenzione al modo in cui si elaborano i file caricati (si pensi ai flussi), è possibile fare in modo che l'intero processo utilizzi pochissima memoria, anche per quelle che sarebbero tradizionalmente operazioni costose. Questo approccio richiede pochissime impostazioni effettive per la tua app per funzionare, e nessuna reale modifica al tuo codice, ma richiede un particolare ambiente (server Apache), oltre alla possibilità di configurarlo.

Ho anche avuto fortuna usando jQuery-File-Upload, che supporta roba buona come caricamenti chunked e ripristinabili. Senza qualcosa come mod_porter, questo può ancora legare un intero thread di esecuzione durante il caricamento, ma dovrebbe essere decente sulla memoria, se fatto bene. Ciò si traduce anche in un file che è "vicino" e, di conseguenza, facile da elaborare.Questo approccio richiederà modifiche al livello di visualizzazione da implementare e non funzionerà con tutti i browser.

Hai menzionato FTP e BitTorrent come opzioni possibili. Queste non sono così male di opzioni come si potrebbe pensare, in quanto è ancora possibile ottenere i file molto vicino al server. Non si escludono nemmeno a vicenda, il che è bello, perché (come hai sottolineato) richiedono un altro client che potrebbe essere o non essere presente sulla macchina che carica. Il modo in cui funziona è, in pratica, hai impostato un'area da cui scaricare per renderlo visibile alla tua app. Quindi, se è necessario eseguire qualsiasi elaborazione, si esegue un cron job (o qualsiasi altra cosa) per monitorare tale posizione per i caricamenti e attivare il metodo di elaborazione dei server. Questo non ti dà la risposta immediata che i metodi sopra possono fornire, ma puoi impostare che l'intervallo sia abbastanza piccolo da essere abbastanza vicino. L'unico vero vantaggio di questo metodo è che i protocolli utilizzati sono più adatti al trasferimento di file di grandi dimensioni, il requisito del cliente aggiuntivo e il processo frammentato di solito superano di gran lunga tutti i vantaggi, secondo la mia esperienza.

Se non hai bisogno di alcuna elaborazione, la soluzione migliore è semplicemente andare direttamente a S3 con loro. Questa soluzione cade nel secondo in cui devi effettivamente fare qualsiasi cosa con i file diversi da server come risorse statiche ....

Non ho alcuna esperienza con l'HTML5 FileSystemAPI in un'app per rails, quindi non posso parliamo a quel punto, anche se sembra che limiti significativamente i client che sei in grado di supportare.

Sfortunatamente, non esiste un vero proiettile d'argento: tutte queste opzioni devono essere valutate rispetto all'ambiente nel contesto di ciò che si sta tentando di realizzare. Ad esempio, potresti non essere in grado di configurare il tuo server web o scrivere in modo permanente sul tuo file system locale. Per quello che vale, penso che jQuery-File-Upload sia probabilmente la soluzione migliore nella maggior parte degli ambienti, in quanto richiede solo modifiche alla tua applicazione, quindi puoi spostare un'implementazione in un altro ambiente più facilmente.

1

Vorrei bypassare il server dei binari e pubblicare i file di grandi dimensioni (divisi in blocchi) direttamente dal browser su Amazon Simple Storage. Dai uno sguardo a questo post sulla divisione dei file con JavaScript. Sono un po 'curioso di quanto sia performante questa installazione e mi sento di armeggiare con questa configurazione questo fine settimana.

+0

@ eabharam..There è un po 'di problema di prestazioni quando si utilizzano amazon.have provato una volta – Catmandu

1

Penso che Brad Werth abbia inchiodato la risposta

solo un approccio può essere caricato direttamente su S3 (e anche se hai bisogno di un rielaborazione dopo aver potuto usare teoricamente aws lambda per notificare la tua app ... bu t ad essere onesti sto solo indovinando qui, sto per risolvere lo stesso problema me stesso, mi spieghi questo più tardi)

http://aws.amazon.com/articles/1434

se si utilizza carrierwave

1

Questo progetto è un nuovo protocollo su HTTP per supportare il caricamento può essere ripristinato per file di grandi dimensioni. Ignora Rails fornendo il proprio server.

http://tus.io/

Problemi correlati