Almacenamiento en caché de imágenes dinámicas en Rails
-
22-07-2019 - |
Pregunta
Estoy usando la gema rmagick para generar imágenes dinámicas desde un controlador. El controlador toma una identificación como parámetro, busca en un modelo, escribe texto sobre una imagen existente y la muestra.
He ejecutado algunos puntos de referencia comparando la generación para cada solicitud en lugar de escribir en el disco y usar send_data
para generarlo si ya existe. No he notado mucha diferencia en las solicitudes / segundo entre estos dos métodos.
¿Existe alguna práctica recomendada para almacenar en caché la imagen o escribirla en el disco en lugar de generarla dinámicamente para cada solicitud? Una vez generadas, estas imágenes permanecerían en su mayoría estáticas, pero también me gustaría la opción de volver a generarlas después de un cierto intervalo de tiempo.
Solución
La mejor práctica es almacenar en caché las imágenes generadas y permitir que el servidor web las sirva.
Use un servidor web como Apache o Nginx frente a su aplicación Rails, y asegúrese de escribir la imagen en una ubicación donde el servidor web pueda servirla. Entonces, si su ruta Rails se evalúa como /dynamic_images/3.png
(que llama a dynamic_images_controller
action show
con id = 3 y format = png), escriba esa imagen en public / dynamic_images / 3.png
y use send_file
en el controlador para enviarla.
La próxima vez que se solicite ese archivo ( /dynamic_images/3.png
), el servidor web con mucho gusto lo servirá (en caché) y la aplicación Rails nunca será golpeada.
Para necesidades avanzadas, como volver a generar las imágenes y limpiar el código de su controlador, consulte el clip de papel gema.
Otros consejos
Solo una idea (nunca probada): ¿por qué no almacenar imágenes (especialmente las que se generan dinámicamente) con memache?
Rails.cache.write (" MY_IMAGE " ;, imagen)
Debe colocar las imágenes en caché en dicho directorio desde donde serán atendidas por el servidor web. No desea utilizar send_data para esto, eso es demasiado lento. Además, es probable que desee ignorar ese directorio en su VCS.