¿Cómo usar el caché de onda portadora en Heroku múltiples dynos?

Tengo una aplicación con Carrierwave en Heroku. En una página, tengo 2 formularios: 1 formulario ajax para cargar una imagen y 1 formulario normal para obtener información adicional necesaria para crear el objeto. Supongamos que mi montura Carrierwave es :picture, cada vez que se envía el formulario ajax, la imagen se guarda temporalmente en la carpeta pública y su ruta se devuelve como :picture_cache. El segundo formulario luego usa eso para saber qué imagen se creará con el nuevo objeto en la segunda solicitud. Esto funciona bien para un solo banco de pruebas.

Diferentes dynos no conocen los sistemas de archivos de los demás. Por lo tanto, si la solicitud para enviar el segundo formulario no llega al mismo dinamómetro que la solicitud del primer formulario, no podrá encontrar la imagen.

¿Alguien ha abordado este problema?

preguntado el 12 de junio de 12 a las 17:06

¿Alguna vez resolviste esto? ¿Sin tener que usar Mongoid? -

1 Respuestas

utilizo un modelo personalizado y almaceno todos los archivos, incluidos los tmp, en mongodb. las subidas se marcan como tmp. los modelos están 'guardados', simplemente elimino la bandera 'tmp'. de esta manera, todos los nodos ven todas las imágenes todo el tiempo. es bastante loco que el valor predeterminado de carrierwave sea almacenar en caché en ./tmp, ya que muchas configuraciones de múltiples nodos verían este problema (a menos que el balanceador implemente la afinidad de sesión).

aquí está mi modelo y controlador, etc.: https://gist.github.com/3161569

tienes que hacer un trabajo personalizado en la forma:

  • guarde todos los archivos publicados, pase lo que pase
  • transmitir la identificación del archivo publicado en un campo oculto
  • al guardar, busque un archivo y/o una identificación previamente cargada
  • hacer las asociaciones modelo

este enfoque, aunque no es 'mágico', también produce los siguientes efectos secundarios increíbles:

  • SUS SUEÑOS. una procesar trabajos en ejecución en segundo plano para miniaturas de las imágenes en lugar de girar image_magick cada vez que un usuario presiona 'enviar' (que es un grave DOS vector, especialmente en hosts con memoria limitada como heroku)

  • puede migrar imágenes a s3 en segundo plano, cada hora, lo que sea, y las cargas simplemente tienen una nueva URL (en este caso, el controlador debe emitir una redirección permanente si nota esto). esto es realmente bueno porque puede mantenerlos en la base de datos para desarrollo, puesta en escena, etc. y migrar algunas o todas las cargas a s3 en cualquier momento sin cambiar ningún código de carga o vista.

Respondido 23 Jul 12, 02:07

¿Qué pasa si no estás en Mongoid? - Stephenmurdoch

@marflar Estoy seguro de que la mayoría de las bases de datos SQL también permiten almacenar datos binarios como imágenes, por ejemplo, si trabaja con PG esta SO-respuesta y Documentación de la interfaz de objetos grandes puede ser de su interés. - Timo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.