"Primero haz que funcione, luego hazlo rápido" No siempre es correcto

Es posible que haya escuchado el consejo de programación "Primero hágalo funcionar, luego hágalo rápido".. No es del todo erróneo. Sin embargo, sin el contexto adecuado, se tiende a malinterpretar y a no aplicarse correctamente.

El consejo debe evitar que el desarrollador optimice el código de forma prematura, ya que es posible que nunca se ejecute, o que se ejecute tan raramente, que una optimización no tenga el impacto suficiente para justificar el esfuerzo que se realiza en la optimización. Además, la optimización podría generar código más complejo e introducir errores. Por lo tanto, si es desarrollador, no invierta demasiado tiempo en microoptimizar cada línea de código. Asegúrese de elegir las estructuras de datos, los algoritmos y las bibliotecas adecuados y espere al análisis del punto interactivo de un generador de perfiles para ver dónde una optimización más completa podría aumentar el rendimiento general.

Decisiones y artefactos arquitectónicos

Sin embargo, el consejo de "primero que funcione, luego que sea rápido" es totalmente erróneo cuando se trata de decisiones "arquitectónicas". ¿Qué son las decisiones arquitectónicas? En pocas palabras, son las decisiones que son costosas, difíciles y/o imposibles de cambiar posteriormente. Tenga en cuenta que "caro" a veces es lo mismo que "imposible". Por ejemplo, cuando el proyecto se está quedando sin presupuesto, es imposible implementar cambios costosos. Los cambios de infraestructura a son el primer tipo de cambios en esa categoría que llegan a la mente de la mayoría de la gente. Pero también hay otro tipo de artefactos "arquitectónicos" que pueden volverse muy desagradables de cambiar:

  1. Fragmentos de código en el "centro" de una aplicación, en los que se basan muchas otras partes. Para cambiarlas, es necesario cambiar todas las dependencias y volver a probarlas a la vez.

  2. Artefactos, que están involucrados en algún escenario asincrónico, dependiente del tiempo donde la entrada - y por lo tanto el comportamiento del sistema puede variar muy aleatoriamente. Los cambios pueden tener efectos impredecibles y pueden ser difíciles de probar.

  3. Patrones de software que se utilizan y reutilizan una y otra vez, en todas las piezas y partes del sistema. Si el patrón de software resulta ser subóptimo, es necesario volver a codificar todos los artefactos que utilizan el patrón.

¿Recuerdas? En la parte superior de esta página dijimos, que el Dispatcher AEM es una parte esencial de una aplicación de la. El acceso a una aplicación web es muy aleatorio: los usuarios van y vienen en momentos impredecibles. Al final, todo el contenido se almacenará (o deberá almacenarse) en la caché de Dispatcher. Por lo tanto, si ha prestado mucha atención, es posible que se haya dado cuenta de que el almacenamiento en caché podría verse como un artefacto "arquitectónico" y, por lo tanto, debería ser entendido por todos los miembros del equipo, desarrolladores y administradores por igual.

No decimos que un desarrollador deba configurar realmente Dispatcher. Necesitan conocer los conceptos, especialmente los límites, para asegurarse de que Dispatcher también pueda aprovechar su código.

La Dispatcher no mejora mágicamente la velocidad del código. Un desarrollador debe crear estos componentes teniendo en cuenta Dispatcher. Por lo tanto, necesita saber cómo funciona.

Almacenamiento en caché de Dispatcher: principios básicos

Dispatcher como almacenamiento en caché Http: equilibrador de carga

¿Qué es el Dispatcher y por qué se llama "Dispatcher" en primer lugar?

La Dispatcher es

  • En primer lugar, una caché

  • Un proxy inverso

  • AEM Un módulo para el servidor web Apache httpd, añadiendo funciones relacionadas con la versatilidad de Apache y trabajando sin problemas junto con todos los demás módulos Apache (como SSL o incluso SSI incluye, como veremos más adelante)

En los primeros días de la web, se esperaría unos cientos de visitantes a un sitio. Una configuración de una Dispatcher AEM, "despachó" o equilibró la carga de solicitudes a una serie de servidores de publicación y que generalmente era suficiente, por lo tanto, el nombre "Dispatcher". Sin embargo, en la actualidad ya no se utiliza con mucha frecuencia.

Más adelante en este artículo veremos diferentes formas de configurar Dispatcher y sistemas de Publish. En primer lugar, vamos a empezar con algunos conceptos básicos del almacenamiento en caché http.

Funcionalidad básica de una caché de Dispatcher

Funcionalidad básica de una caché de Dispatcher

Los conceptos básicos de Dispatcher se explican aquí. Dispatcher es un proxy inverso de almacenamiento en caché simple con la capacidad de recibir y crear solicitudes HTTP. Un ciclo normal de solicitud/respuesta es el siguiente:

  1. Un usuario solicita una página
  2. El Dispatcher comprueba si ya tiene una versión procesada de esa página. Supongamos que es la primera solicitud de esta página y que Dispatcher no puede encontrar una copia en caché local.
  3. Dispatcher solicita la página desde el sistema de Publish
  4. En el sistema de Publish, la página se procesa mediante una plantilla JSP o HTL
  5. La página se devuelve a Dispatcher
  6. Dispatcher almacena en caché la página
  7. Dispatcher devuelve la página al explorador
  8. Si se solicita la misma página por segunda vez, se puede servir directamente desde la caché de Dispatcher sin necesidad de volver a procesarla en la instancia de Publish. Esto ahorra tiempo de espera para los ciclos de usuario y CPU en la instancia de Publish.

Estábamos hablando de "páginas" en la última sección. Pero el mismo esquema también se aplica a otros recursos como imágenes, archivos CSS, descargas de PDF, etc.

Cómo se almacenan en caché los datos

El módulo Dispatcher aprovecha las funciones que proporciona el servidor Apache de alojamiento. Los recursos como páginas de HTML, descargas e imágenes se almacenan como archivos simples en el sistema de archivos de Apache. Es así de simple.

El nombre de archivo se deriva de la dirección URL del recurso solicitado. Si solicita un archivo /foo/bar.html, se almacena, por ejemplo, en /var/cache/docroot/foo/bar.html.

En principio, si todos los archivos se almacenan en caché y, por lo tanto, se almacenan estáticamente en Dispatcher, puede extraer el complemento del sistema Publish y Dispatcher actuaría como un sencillo servidor web. Pero esto es solo para ilustrar el principio. La vida real es más complicada. No puede almacenar todo en caché, y la caché nunca está completamente "llena", ya que el número de recursos puede ser infinito debido a la naturaleza dinámica del proceso de renderización. El modelo de un sistema de archivos estático ayuda a generar una imagen aproximada de las capacidades de Dispatcher. Y ayuda a explicar las limitaciones de Dispatcher.

AEM La estructura de la URL y la asignación del sistema de archivos

Para comprender Dispatcher con más detalle, volvamos a revisar la estructura de una URL de ejemplo simple. Veamos el siguiente ejemplo…

http://domain.com/path/to/resource/pagename.selectors.html/path/suffix.ext?parameter=value&otherparameter=value#fragment

  • http indica el protocolo

  • domain.com es el nombre de dominio

  • path/to/resource es la ruta en la que se almacena el recurso en CRX y, posteriormente, en el sistema de archivos del servidor Apache

AEM A partir de aquí, las cosas difieren un poco entre el sistema de archivos del sistema de archivos del sistema de archivos del sistema de archivos de Apache y el sistema de archivos del sistema de archivos del sistema de archivos del servidor.

AEM En el

  • pagename es la etiqueta de recursos

  • selectors representa una serie de selectores utilizados en Sling para determinar cómo se procesa el recurso. Una dirección URL puede tener un número arbitrario de selectores. Están separados por un punto. Una sección de selectores podría ser, por ejemplo, algo así como "french.mobile.fantasía". Los selectores solo deben contener letras, dígitos y guiones.

  • html, como el último de los "selectores", se denomina extensión. AEM En el caso de Sling, también determina en parte el script de renderización.

  • path/suffix.ext es una expresión de ruta de acceso que puede ser un sufijo a la dirección URL. AEM Se puede utilizar en scripts de para controlar aún más cómo se procesa un recurso. Tendremos una sección completa sobre esta parte más adelante. Por ahora, debería ser suficiente con saber que puede utilizarlo como parámetro adicional. Los sufijos deben tener una extensión.

  • ?parameter=value&otherparameter=value es la sección de consulta de la dirección URL. AEM Se utiliza para pasar parámetros arbitrarios a los. Las URL con parámetros no se pueden almacenar en caché y, por lo tanto, los parámetros deben limitarse a casos en los que sean absolutamente necesarios.

  • AEM #fragment, la parte de fragmento de una dirección URL no se pasa a la dirección URL, por lo que solo se utiliza en el explorador; ya sea en los marcos de JavaScript como "parámetros de enrutamiento" o para saltar a una parte determinada de la página.

En Apache (haga referencia al diagrama siguiente),

  • pagename.selectors.html se usa como nombre de archivo en el sistema de archivos de la caché.

Si la dirección URL tiene un sufijo path/suffix.ext,

  • pagename.selectors.html se ha creado como una carpeta

  • path una carpeta en la carpeta pagename.selectors.html

  • suffix.ext es un archivo en la carpeta path. Nota: Si el sufijo no tiene una extensión, el archivo no se almacena en caché.

Diseño del sistema de archivos después de obtener las direcciones URL del Dispatcher

Diseño del sistema de archivos después de obtener las direcciones URL del Dispatcher

Limitaciones básicas

La asignación entre una dirección URL, el recurso y el nombre de archivo es bastante sencilla.

Sin embargo, es posible que haya notado algunas trampas,

  1. Las direcciones URL pueden llegar a ser muy largas. Añadir la parte "path" de /docroot en el sistema de archivos local podría superar fácilmente los límites de algunos sistemas de archivos. La ejecución de Dispatcher en NTFS en Windows puede ser un desafío. Sin embargo, está seguro con Linux.

  2. Las direcciones URL pueden contener caracteres especiales y diéresis. Esto no suele ser un problema para Dispatcher. Sin embargo, tenga en cuenta que la dirección URL se interpreta en muchos lugares de la aplicación. La mayoría de las veces, hemos visto comportamientos extraños de una aplicación, solo para descubrir que un fragmento de código (personalizado) raramente utilizado no se probó a fondo para caracteres especiales. Deberías evitarlos si puedes. Y si no puedes, planea hacer pruebas exhaustivas.

  3. En CRX, los recursos tienen subrecursos. Por ejemplo, una página tendrá una serie de páginas secundarias. Esto no puede coincidir en un sistema de archivos, ya que los sistemas de archivos tienen archivos o carpetas.

Las URL sin extensión no se almacenan en caché

Las direcciones URL siempre deben tener una extensión. AEM Aunque puede ofrecer direcciones URL sin extensiones en el servicio de direcciones de correo electrónico de. Estas direcciones URL no se almacenarán en la caché de Dispatcher.

Ejemplos

http://domain.com/home.html es almacenable en caché

http://domain.com/home no se puede almacenar en caché

La misma regla se aplica cuando la dirección URL contiene un sufijo. El sufijo debe tener una extensión para poder almacenarse en caché.

Ejemplos

http://domain.com/home.html/path/suffix.html es almacenable en caché

http://domain.com/home.html/path/suffix no se puede almacenar en caché

Podría preguntarse qué sucede si la parte del recurso no tiene extensión, pero el sufijo sí la tiene. Bueno, en este caso la URL no tiene sufijo. Mire el siguiente ejemplo:

Ejemplo

http://domain.com/home/path/suffix.ext

/home/path/suffix es la ruta de acceso al recurso… por lo que no hay sufijo en la dirección URL.

Conclusión

Agregue siempre extensiones tanto a la ruta como al sufijo. Las personas con conocimiento de SEO a veces argumentan, que esto te está clasificando en los resultados de búsqueda. Pero una página sin caché sería muy lenta y se clasificaría aún más abajo.

URL de sufijos en conflicto

Imagine que tiene dos direcciones URL válidas

http://domain.com/home.html

y

http://domain.com/home.html/suffix.html

AEM Son absolutamente válidos en la práctica de la. No vería ningún problema en su equipo de desarrollo local (sin un Dispatcher). Lo más probable es que tampoco encuentre ningún problema en las pruebas de carga o UAT. El problema que enfrentamos es tan sutil que se desliza por la mayoría de las pruebas. Esto le golpeará fuertemente cuando esté en las horas de mayor actividad y tenga un tiempo limitado para solucionarlo, probablemente no tenga acceso al servidor ni recursos para solucionarlo. Hemos estado allí…

Entonces… ¿cuál es el problema?

home.html en un sistema de archivos puede ser un archivo o una carpeta. AEM No ambos al mismo tiempo que en el caso de la.

Si solicita home.html primero, se creará como un archivo.

Las solicitudes posteriores a home.html/suffix.html devuelven resultados válidos, pero como el archivo home.html "bloquea" la posición en el sistema de archivos, home.html no se puede crear por segunda vez como carpeta y, por lo tanto, home.html/suffix.html no se almacena en caché.

Posición de bloqueo de archivos en el sistema de archivos que impide que se almacenen en caché los subrecursos

Posición de bloqueo de archivos en el sistema de archivos que impide que se almacenen en caché los subrecursos

Si lo hace al revés, primero debe solicitar home.html/suffix.html y después suffix.html se almacena en la caché en una carpeta /home.html al principio. Sin embargo, esta carpeta se elimina y se reemplaza por un archivo home.html cuando posteriormente se solicita home.html como recurso.

Eliminando una estructura de ruta de acceso cuando se busca un recurso principal

Eliminando una estructura de ruta de acceso cuando se busca un recurso principal

Por lo tanto, el resultado de lo que se almacena en caché es completamente aleatorio y depende del orden de las solicitudes entrantes. Lo que hace que las cosas sean aún más complicadas es el hecho de que normalmente tiene más de un distribuidor. Además, el rendimiento, la tasa de aciertos de caché y el comportamiento pueden variar de un Dispatcher a otro. Si desea saber por qué su sitio web no responde, debe asegurarse de que está viendo el Dispatcher correcto con el desafortunado orden de almacenamiento en caché. Si estás buscando en el Dispatcher que - por suerte - tenía un patrón de solicitud más favorable, te perderás en tratar de encontrar el problema.

Evitar URL en conflicto

Puede evitar "URL en conflicto", donde un nombre de carpeta y un nombre de archivo "compiten" por la misma ruta en el sistema de archivos, cuando utiliza una extensión diferente para el recurso y tiene un sufijo.

Ejemplo

  • http://domain.com/home.html

  • http://domain.com/home.dir/suffix.html

Ambos son perfectamente almacenables en caché,

Elegir una extensión dedicada "dir" para un recurso cuando se solicita un sufijo o se evita el uso del sufijo por completo. Hay casos raros en los que son útiles. Y es fácil implementar estos casos correctamente. Como veremos en el siguiente capítulo, cuando hablemos de invalidación y vaciado de caché.

Solicitudes no almacenables en caché

Revisemos un resumen rápido del último capítulo más algunas excepciones más. Dispatcher puede almacenar en caché una dirección URL si está configurada para almacenarse en caché y si es una solicitud de GET. No se puede almacenar en caché con una de las siguientes excepciones.

Solicitudes en caché

  • La solicitud está configurada para que se pueda almacenar en caché en la configuración de Dispatcher
  • La solicitud es una solicitud de GET sin formato

Solicitudes o respuestas que no se pueden almacenar en caché

  • Solicitud que la configuración deniega el almacenamiento en caché (ruta, patrón, tipo MIME)
  • Respuestas que devuelven un encabezado "Dispatcher: sin caché"
  • Respuesta que devuelve un encabezado "Cache-Control: no-cache|private"
  • Respuesta que devuelve un encabezado "Pragma: sin caché"
  • Solicitud con parámetros de consulta
  • URL sin extensión
  • URL con un sufijo que no tiene extensión
  • Respuesta que devuelve un código de estado distinto de 200
  • Solicitud de POST