subdomains standard google engine domain custom change app html google-app-engine caching

html - standard - google cloud app engine dns



Google App Engine: almacenamiento en caché de HTML generado (5)

He escrito una aplicación de Google App Engine que genera programáticamente un montón de código HTML que es realmente el mismo resultado para cada usuario que inicia sesión en mi sistema, y ​​sé que esto será eficiente cuando el código entre en producción. Por lo tanto, estoy tratando de encontrar la mejor manera de almacenar en caché las páginas generadas.

La opción más probable es generar las páginas y escribirlas en la base de datos, y luego verificar la hora de la operación de puesta en la base de datos para una página dada en relación con el momento en que se actualizó el código por última vez. Entonces, si el código es más reciente que el último puesto en la base de datos (para una solicitud HTML particular), se generará y servirá HTML nuevo, y se almacenará en caché en la base de datos. Si el código es anterior al último puesto en la base de datos, obtendré el código HTML directo de la base de datos y lo serviré (evitando así el desperdicio de CPU al generar el HTML). No solo estoy buscando minimizar los tiempos de carga, sino también minimizar el uso de la CPU.

Sin embargo, un problema que estoy teniendo es que no puedo encontrar la manera de verificar programáticamente cuándo se actualizó la versión del código cargado en el motor de la aplicación.

Estoy abierto a cualquier sugerencia sobre este enfoque u otros enfoques para el almacenamiento en caché de html generado.

Tenga en cuenta que, si bien Memcache podría ayudar en esta situación, creo que no es la solución final, ya que solo necesito volver a generar html cuando se actualice el código (en lugar de hacerlo cada vez que caduque).


En orden de velocidad:

  1. Memcache
  2. HTML en caché en el almacén de datos
  3. generación de página completa

Su solución de almacenamiento en caché debe tener esto en cuenta. Esencialmente, probablemente recomendaría usar Memcache de todos modos. En la mayoría de los casos, será más rápido que acceder al almacén de datos y cuando genere un bloque grande de HTML, uno de los principales beneficios del almacenamiento en caché es que posiblemente no tenga que incurrir en la penalización de E / S para acceder a los datos. almacenar. Si almacena en caché utilizando el almacén de datos, aún tiene la penalización de E / S. La diferencia entre regenerar todo y extraer de html almacenado en caché en el almacén de datos es bastante pequeña a menos que tenga una página muy compleja. Probablemente sea mejor obtener un montón de éxitos de caché muy rápidos de Memcache y regenerar por completo de vez en cuando que hacer una llamada al almacén de datos todo el tiempo. No hay nada que te impida invalidar el HTML en caché en Memcache cuando actualizas, y si tu tráfico es lo suficientemente alto como para garantizarlo, siempre puedes hacer un sistema de almacenamiento en caché de niveles múltiples.

Sin embargo, mi principal preocupación es que esta es una optimización prematura. Si todavía no tiene el tráfico, mantenga el almacenamiento en caché al mínimo. App Engine proporciona un conjunto de herramientas de análisis de rendimiento realmente prácticas, y usted debe usarlas para identificar los cuellos de botella después de que tenga al menos algunas QPS de tráfico.

Cada vez que esté haciendo optimización del rendimiento, ¡mida primero! Muchas de las "optimizaciones" de rendimiento resultan ser más lentas que las originales, exactamente iguales, o tienen características de experiencia de usuario negativas (como datos obsoletos). No optimices hasta que estés seguro de que debes hacerlo.




Tema anterior, pero comentaré de todos modos dado que la tecnología ha progresado un poco ... Otra idea que puede o no ser apropiada para usted es generar el HTML y almacenarlo en Google Cloud Storage. Luego acceda al HTML a través de un enlace CDN que el almacenamiento en la nube le brinda. No es necesario comprobar Memcache o esperar a que el almacén de datos se despierte con nuevas solicitudes. He comenzado a almacenar todo mi JavaScript, CSS y otro contenido estático (imágenes, descargas, etc.) como este para mis aplicaciones appengine y funciona bien para mí.


Solo publique una versión estática de su sitio

En realidad es mucho más fácil de lo que piensas.

Si ya tiene un archivo que contiene todas las URL de su sitio (ex urls.py), la mitad del trabajo ya está hecho.

Aquí está la estructura:

+-/website +--/static +---/html +--/app/urls.py +--/app/routes.py +-/deploy.py

/ html es donde se servirán los archivos estáticos. urls.py contiene una lista de todas las URL para su sitio. routes.py (si movió las rutas fuera de main.py) tendrá que modificarse para que pueda ver la versión generada dinámicamente localmente pero sirva la versión estática en producción. deploy.py es su generador de sitios estáticos de una sola parada.

La forma en que diseñe su módulo de urls depende. Personalmente lo uso como una ventanilla única para buscar todos los metadatos de una página, pero YMMV.

Ejemplo:

main = [ { ''uri'':''about-us'', ''url'':''/'', ''template'':''about-us.html'', ''title'':''About Us'' } ]

Con todas las URL del sitio en un formato estructurado, hace que rastrear su propio sitio sea sencillo.

La configuración de la ruta es un poco más complicada. No voy a entrar en detalles porque hay demasiadas formas diferentes en que esto podría lograrse. La pieza importante es el código requerido para detectar si se está ejecutando en un servidor de desarrollo o producción.

Aquí está:

# Detect whether this the ''Development'' server DEV = os.environ[''SERVER_SOFTWARE''].startswith(''Dev'')

Prefiero poner esto en main.py y exponerlo globalmente porque lo uso para activar / desactivar otras cosas como el registro pero, una vez más, YMMV.

Por último, necesitas el rastreador / compilador:

import os import sys import urllib2 from app.urls import main port = ''8080'' local_folder = os.getcwd() + os.sep + ''static'' + os.sep + ''html'' + os.sep print ''Outputting to: '' + local_folder print ''/nCompiling:'' for page in main: http = urllib2.urlopen(''http://localhost:'' + port + page[''url'']) file_name = page[''template''] path = local_folder + file_name local_file = open(path, ''w'') local_file.write(http.read()) local_file.close() print '' - '' + file_name + '' compiled successfully...''

Esto es realmente algo rudimentario. De hecho, me sorprendió lo fácil que fue cuando lo creé. Esto es literalmente el equivalente a abrir su sitio página por página en el navegador, guardar como html y copiar ese archivo en la carpeta / static / html.

La mejor parte es que la carpeta / html funciona como cualquier otra carpeta estática, por lo que se almacenará en caché automáticamente y la caducidad de la caché será la misma que la del resto de los archivos estáticos.

Nota: Esto maneja un sitio donde todas las páginas se sirven desde el nivel de la carpeta raíz. Si necesita anidar más profundamente las carpetas, necesitará una pequeña modificación para manejar eso.