2011-06-10 20 views
12

Estoy construyendo una aplicación de Rails que se ocupa de la carga de archivos a través de CarrierWave. Actualmente, las cargas de archivos más grandes bloquean el servidor durante un tiempo significativo. He visto soluciones como la gema s3-swf-upload-plugin que omite el servidor local y envía archivos directamente desde el navegador a S3, pero esto requeriría algunas modificaciones para pregenerar nombres de archivo únicos y sincronizarlos con la base de datos. Estoy seguro de que no sería demasiado problema, pero la nueva pila Cedar de Heroku me dio la idea de descargar estas solicitudes de larga ejecución a una instancia de node.js que se ejecuta en la misma aplicación. No tengo mucha experiencia con este tipo de cosas, así que disculpe mi fraseología si está un poco mal.Rails and Node en la misma aplicación en Heroku?

¿Sería algo como esto posible? ¿Cómo se configurarían las cosas de manera tal que ciertas solicitudes (que implican la carga de archivos, en este caso) se manejarían mediante una aplicación de nodo incluida en el mismo repositorio heroku que la aplicación principal de rieles?

+0

¿Ha considerado ejecutar una aplicación heroku separada para las cargas? – Elad

+0

Incluso si estuvieran en instancias separadas, creo que la pregunta aún se aplica sobre cómo integrarlos juntos. Además, no estoy seguro de cómo compartir una base de datos iría entre dos aplicaciones heroku separadas. – Luke

+0

Puede obtener la cadena de conexión de la base de datos desde ENV ['DATABASE_URL'] y debería poder usarla en la segunda aplicación. De hecho, con una base de datos dedicada, puede acceder a ella incluso desde una aplicación fuera de heroku: http://devcenter.heroku.com/articles/external-database-access – Elad

Respuesta

8

No creo que sea posible mezclar Rails y Node en la misma aplicación. Sin embargo, puede obtener aproximadamente la misma funcionalidad al usar dos aplicaciones separadas que se comunican entre sí.

Puede usar ENV ['DATABASE_URL'] para determinar la cadena de conexión de su base de datos. Use la consola heroku para configurarlo como una variable ENV para su aplicación Node (por ejemplo, heroku config:add OTHER_DB=your_connection_string) y luego debería ser capaz de usar la misma cadena de conexión para conectarse a la misma base de datos desde su otra aplicación heroku. Incluso puede acceder a él fuera de heroku si tiene una base de datos dedicada, consulte: http://devcenter.heroku.com/articles/external-database-access

Para una integración perfecta entre las dos aplicaciones, puede tener un formulario representado por la publicación de la aplicación Rails en una URL de la aplicación Nodo. Además de la carga del archivo, incluya en ese formulario a través de los campos de entrada ocultos otras variables que necesite para comunicarse con la aplicación Nodo. Cuando finalice la carga en la aplicación Nodo, podría redirigir al cliente a la aplicación Rails, pasando cualquier estado o variable como parámetros de obtención.

Ejecute las dos aplicaciones en dos subdominios del mismo dominio e incluso podría compartir cookies entre ellas.

+0

Gracias, esto es muy útil – Luke

+0

No entiendo por qué la aplicación de rieles se publica en una URL de la aplicación Nodo. ¿Por qué no llamar a una URL de Rails desde un nodo para obtener el HTML? – Tony

+0

Supongo que también podría hacer eso ... – Elad

2

Necesita dos aplicaciones. Estoy haciendo exactamente lo que se describe en esta pregunta. Quería grandes cargas de transmisión, y como Rack escribe las descargas en un archivo temporal antes de pasarlas al manejador, no es posible hacer esto con Rails.

Node.js, por otro lado, hace esto maravillosamente. Entonces, hay dos aplicaciones Heroku, la aplicación web Rails y la aplicación web Node.js (Express). La aplicación web Rails usa SWFUpload como la solución del lado del cliente. La aplicación Rails y la aplicación Node.js tienen una clave secreta como una variable de configuración de Heroku. Cuando es hora de que el usuario cargue, JavaScript del lado del cliente solicita una URL de carga del servidor de Rails. El servidor Rails forma una URL de carga con un parámetro expira y calcula una firma usando la clave secreta. El manejador de Javascript del lado del cliente pasa esta URL junto a SWFUpload (propiedad upload_url). El usuario selecciona los archivos para cargar y SWFUpload comienza a publicarlos en upload_url. La aplicación Node.js verifica que la URL no está vencida y que la firma es válida. Procesa los datos del formulario con la biblioteca formidable.

Otro detalle. Flash requiere que la aplicación Node.js sirva un crossdomain.xml que permita la solicitud entre sitios.

Mi aplicación Node.js no toca la base de datos; pero si lo hiciera, compartiría DATABASE_URL como se sugirió anteriormente. Tenga en cuenta que no puede compartir un DATABASE_URL fuera de Heroku a menos que tenga un DB dedicado. Las DATABASE_URLs para bases de datos compartidas no son accesibles desde fuera de Heroku (a diferencia de otros servicios como RedisToGo).

Cuestiones relacionadas