rails desde curso cero ruby-on-rails http bittorrent large-file-upload

ruby on rails - desde - ¿Cuál es el mejor enfoque para manejar grandes cargas de archivos en una aplicación de rieles?



curso de ruby (5)

Creo que Brad Werth clavó la respuesta

solo se puede cargar un enfoque directamente a S3 (e incluso si necesitas algún reprocesamiento después de que puedas utilizar teóricamente aws lambda para notificar a tu aplicación ... pero para ser sincero, solo estoy adivinando aquí, estoy por resolver el problema). Mismo problema, lo ampliaré más adelante)

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

si usa carrierwave

Estoy interesado en comprender los diferentes enfoques para manejar grandes cargas de archivos en una aplicación de Rails, archivos de 2-5Gb.

Entiendo que para transferir un archivo de este tamaño será necesario dividirlo en partes más pequeñas, investigué un poco y aquí está lo que tengo hasta ahora.

  • Se requerirá la configuración del lado del servidor para aceptar solicitudes POST grandes y probablemente una máquina de 64 bits para manejar cualquier cosa superior a 4 Gb .
  • AWS admite la carga de varias partes.
  • HTML5 FileSystemAPI tiene un cargador persistente que carga el archivo en fragmentos.
  • Una biblioteca para Bitorrent aunque esto requiere un cliente de transmisión que no es ideal

¿Se pueden reanudar todos estos métodos como FTP, la razón por la que no quiero usar FTP es que deseo mantenerme en la aplicación web si esto es posible? He utilizado carrierwave y paperclip, pero estoy buscando algo que pueda reanudarse, ya que cargar un archivo de 5 Gb podría llevar algún tiempo.

De estos enfoques que he enumerado, me gustaría saber qué ha funcionado bien y si hay otros enfoques que me pueden estar faltando. Sin complementos, si es posible, preferiría no usar Applets de Java o Flash. Otra preocupación es que estas soluciones mantienen el archivo en la memoria durante la carga, que también es una restricción que preferiría evitar si es posible.


He tratado este tema en varios sitios, utilizando algunas de las técnicas que ha ilustrado anteriormente y algunas que no. La buena noticia es que en realidad es bastante realista permitir cargas masivas.

Mucho de esto depende de lo que realmente planee hacer con el archivo una vez que lo haya cargado ... Mientras más trabajo tenga que hacer en el archivo, más cerca lo va a querer de su servidor. Si necesita hacer un procesamiento inmediato en la carga, es probable que desee hacer una solución de rieles puros. Si no necesita hacer ningún procesamiento, o no es crítico en el tiempo, puede comenzar a considerar soluciones "híbridas" ...

Lo creas o no, en realidad tuve mucha suerte solo al usar mod_porter . Mod_porter hace que apache haga un montón del trabajo que su aplicación normalmente haría. Ayuda a no atar un hilo y un montón de memoria durante la carga. Resulta en un archivo local para su aplicación, para facilitar el procesamiento. Si prestas atención a la forma en que procesas los archivos cargados (secuencias de pensamiento), puedes hacer que todo el proceso use muy poca memoria, incluso para lo que tradicionalmente serían operaciones bastante caras. Este enfoque requiere muy poca configuración real para que su aplicación funcione, y no hay una modificación real de su código, pero sí requiere un entorno particular (servidor Apache), así como la capacidad de configurarlo.

También he tenido suerte usando jQuery-File-Upload , que admite cosas buenas como subidas en bloque y reanudables. Sin algo como mod_porter, esto todavía puede atar un hilo completo de ejecución durante la carga, pero debería ser decente en la memoria, si se hace bien. Esto también da como resultado un archivo que está "cerca" y, como resultado, es fácil de procesar. Este enfoque requerirá ajustes en su capa de vista para implementarlo, y no funcionará en todos los navegadores.

Mencionaste FTP y bittorrent como posibles opciones. Estas no son tan malas opciones como podría pensar, ya que aún puede obtener los archivos bastante cerca del servidor. Ni siquiera son mutuamente excluyentes, lo cual es bueno, porque (como usted señaló) requieren un cliente adicional que puede o no estar presente en la máquina de carga. La forma en que esto funciona es, básicamente, configurar un área para que ellos descarguen para que sea visible por su aplicación. Luego, si necesita hacer algún procesamiento, ejecuta un trabajo cron (o lo que sea) para monitorear esa ubicación para las cargas y activar su método de procesamiento de servidores. Esto no le proporciona la respuesta inmediata que pueden proporcionar los métodos anteriores, pero puede establecer que el intervalo sea lo suficientemente pequeño como para acercarse mucho. La única ventaja real de este método es que los protocolos utilizados son más adecuados para transferir archivos de gran tamaño, los requisitos adicionales del cliente y el proceso fragmentado generalmente superan cualquier beneficio de eso, en mi experiencia.

Si no necesita ningún procesamiento, su mejor opción puede ser simplemente ir directamente a S3 con ellos. Esta solución se cae en el momento en que realmente necesita hacer algo con los archivos que no sean servidores como activos estáticos ....

No tengo ninguna experiencia con HTML5 FileSystemAPI en una aplicación de rieles, por lo que no puedo hablar sobre ese punto, aunque parece que limitaría significativamente los clientes que puede admitir.

Desafortunadamente, no hay una verdadera bala de plata: todas estas opciones deben sopesarse contra su entorno en el contexto de lo que está tratando de lograr. Es posible que no pueda configurar su servidor web o escribir permanentemente en su sistema de archivos local, por ejemplo. Por lo que vale, creo que jQuery-File-Upload es probablemente su mejor apuesta en la mayoría de los entornos, ya que solo requiere una modificación en su aplicación, por lo que podría trasladar una implementación a otro entorno más fácilmente.


Pasaría por alto el servidor de rieles y publicaría sus archivos de gran tamaño (divididos en fragmentos) directamente desde el navegador a Amazon Simple Storage . Eche un vistazo a esta post sobre la división de archivos con JavaScript. Estoy un poco curioso de lo eficiente que sería esta configuración y tengo ganas de jugar con esta configuración este fin de semana.



Este proyecto es un protocolo nuevo a través de HTTP para admitir la carga reanudable de archivos de gran tamaño. Omite Rails al proporcionar su propio servidor.

http://tus.io/