¿Cuál es la mejor manera de almacenar imágenes en el lado del servidor de aplicaciones móviles y cargarlas?

Recientemente tuve que resolver el mismo problema, así que estoy feliz de compartir mi solución.

Mi requisito era construir un sistema escalable para cambiar el tamaño y almacenar en caché las imágenes sobre la marcha a cualquier resolución y calidad que se necesitara. Quería minimizar IO para imágenes “calientes”. Es decir, si las imágenes se solicitan con frecuencia, deberían volverse “calientes” en todos los cachés.

Mi solución se basa en la memoria caché grupal. Groupcache es una lectura distribuida que no caduca a través de la caché LRU. A diferencia de la mayoría de las soluciones de caché, no puede agregar pares de valores clave a la memoria caché de grupo. En su lugar, define cómo recuperar el valor de una clave específica.

Lo que hace que groupcache sea una buena herramienta para este problema es que cuando varios servidores dentro del grupo groupcache solicitan la misma clave, los datos se recuperan solo una vez y luego se distribuyen automáticamente a los otros servidores. Cargar una imagen nunca será más de un IO.

Esta solución es aplicable no solo a las imágenes sino también a todo lo que se puede traducir a bytes. El tiempo de vida se puede lograr agregando una marca de tiempo redondeada a la clave de caché.

Por supuesto, esta solución viene con compensaciones. No puede almacenar datos en una clave específica. No (todavía) las imágenes activas se cargarán desde el disco o necesitarán múltiples viajes de ida y vuelta a la red para obtener datos de otro miembro del grupo de caché.

Se podría lograr un mayor rendimiento agregando un equilibrador de carga en el frente que distribuya la carga de acuerdo con el hash de url para que haya más posibilidades de alcanzar un caché activo.

Estaré encantado de escuchar opiniones sobre esta solución.

¿Tiene varios íconos en su servidor y elige cuál descargar según el PPI del teléfono?