2009-10-26 17 views
9

Tengo una pregunta sobre el alojamiento de grandes activos generados dinámicamente y Heroku.Heroku: Sirviendo grandes activos generados dinámicamente sin un sistema de archivos local

Mi aplicación ofrecerá la descarga masiva de un subconjunto de sus datos subyacentes, que consistirá en un archivo grande (> 100 MB) generado una vez cada 24 horas. Si estuviera ejecutando en un servidor, simplemente escribiría el archivo en el directorio público.

Pero según tengo entendido, esto no es posible con Heroku. Se puede escribir en el directorio/tmp, pero el tiempo de vida garantizado de los archivos existe seems to be defined en términos de un ciclo de solicitud-respuesta, no un trabajo en segundo plano.

Me gustaría utilizar S3 para alojar el archivo de descarga. El S3 gem admite subidas de transmisión, pero solo para archivos que ya existen en el sistema de archivos local. Parece que el tamaño del contenido debe conocerse por adelantado, lo que no será posible en mi caso.

Esto parece un catch-22. Estoy tratando de evitar crear una cadena gigantesca en la memoria cuando la cargue en S3, pero S3 solo admite la carga de archivos que ya existen en el sistema de archivos local.

Dada una aplicación Rails en la que no puedo escribir en el sistema de archivos local, ¿cómo sirvo un archivo grande que se genera diariamente sin crear una cadena grande en la memoria?

+0

Me enfrenta al mismo problema. Todavía no lo he abordado, pero suponía que podría escribir en el sistema de archivos/tmp en mi trabajador con retraso en el trabajo y que se quedaría el tiempo suficiente para cargar el archivo en S3. ¡Interesado en escuchar lo que la gente sugiere! –

Respuesta

10

${RAILS_ROOT}/tmp (no/tmp, que está en el directorio de su aplicación) tiene una duración de la duración de su proceso. Si está ejecutando un DJ de fondo, los archivos en TMP durarán por la duración de ese proceso.

Actualmente, los archivos durarán más, la razón por la que afirmamos que no puede garantizar la disponibilidad es que tmp no se comparte entre servidores, y cada trabajo/proceso puede ejecutarse en un servidor diferente basado en la carga de la nube. También debe asegurarse de borrar sus archivos cuando haya terminado con ellos como parte del trabajo.

-Otro empleado de Heroku

+0

@teich, eso tiene sentido, ¡gracias! –

3

Rich,

¿Usted ha intentado escribir el archivo de streaming a ./tmp el archivo en S3, entonces?

-Blake Mizerany (Heroku)

+0

@Blake, no lo he intentado porque la documentación de Heroku en el directorio/tmp (vinculada arriba) dice (por lo que puedo decir) que el contenido del directorio sobrevivirá mientras dure una solicitud. Lo que estaría haciendo sería en el contexto de un trabajo de fondo, que parece ser un problema. Si estoy equivocado, entonces genial, eso resolvería el problema. –

Cuestiones relacionadas