¿Cuál sería la mejor manera, rendimiento y costo, para generar imágenes de sitios web sobre la marcha?

Bueno, la mejor opción es servir la gran mayoría de las imágenes fuera de la memoria caché y tener una forma relativamente rápida de llenar la memoria caché. Este tipo de arquitectura también ayudará a configurarlo para escalar y cambiar la forma en que llena el caché con el tiempo.

Además, si separa la porción de la memoria caché y la llena, abrirá la posibilidad de tener muchas formas diferentes de cargar la memoria caché. Entonces, aquí hay algunos pensamientos:

1. Su descripción hace que parezca que está usando PhantomJS en serie para hacer las capturas de pantalla. Debería ejecutar esos procesos en paralelo. Considere usar un clúster de Hadoop en línea (imágenes de AWS EMR o RightScale Hadoop) al que puede agregar máquinas dinámicamente para manejar carga adicional (y terminar nodos cuando la carga cae). (Esto lo ayudará a separar las funciones y eliminar la carga de su servidor web; además, puede ajustar las instancias de Hadoop para el procesamiento más eficiente / rentable).

2. Considere un enfoque en cascada: verifique el caché; si tienes éxito, sirve, de lo contrario, presiona la API de miniaturas; si tiene un éxito, almacene en caché y sirva, de lo contrario, presione PhantomJS. Si está preocupado por la velocidad nuevamente, puede ejecutar todo esto en paralelo y el primero de vuelta con una imagen válida mata a los otros que se están ejecutando. (Esto es un poco como Google maneja los resultados de búsqueda)

3. Haga un seguimiento de la actividad para anticipar a dónde irán las personas y haga que algunos rastreadores web arañen sitios particulares en los que las personas parecen llegar a varias páginas.

4. Recuerde invalidar el caché cuando las imágenes se vuelvan obsoletas (por mucho tiempo que tarde). Puede combinar la invalidación con su araña para que una vez que un sitio esté en caché, siempre esté en el caché, pero probablemente esta no sea una solución viable para siempre.

5. La CPU es barata. Puede valer la pena confiar en un caché y PhantomJS, y simplemente desconectarse de PhantomJS (y configurar el servidor en el que se está ejecutando adecuadamente) para que pueda devolver una imagen en 2-3 segundos, y luego simplemente ejecutar todo procesos en paralelo.

6. Diseñe su sitio para que no sea un gran problema si las imágenes de vista previa tardan un poco en aparecer. Una forma de hacerlo es no cargar las imágenes de vista previa en el HTML base, sino hacer que el usuario las solicite a través de AJAX, pero ya habrá comenzado a extraerlas en la carga inicial de la página. De esta manera, la página web se cargará por completo, podrá mostrar una imagen “en espera” cuando el usuario solicite la vista previa, y parecerá natural que tarde un poco.