1. Descripción general
En las aplicaciones web, la generación de algunos informes puede tardar mucho en calcularse en la base de datos; algunos sitios web proporcionan información meteorológica, lo que requiere acceso a un servidor remoto para realizar una llamada SOAP para obtener información sobre la temperatura. Todos estos son ejemplos de información compleja. Agregar demasiada información compleja a una página web puede provocar que el servidor web y el servidor de base de datos se sobrecarguen. El almacenamiento en búfer de bloques de código JSP brinda a los desarrolladores la libertad de agregar todo tipo de información compleja a voluntad.
JSP puede encapsular y ejecutar código Java complejo en la biblioteca de etiquetas, lo que hace que los archivos de páginas JSP sean más fáciles de mantener y hace que sea más conveniente para los desarrolladores no profesionales utilizar archivos de páginas JSP. Ya existen muchas bibliotecas de etiquetas, que son productos comerciales o productos de código abierto. Pero la mayoría de estos productos solo usan bibliotecas de etiquetas para implementar funciones que se pueden implementar con un simple Scriptlet Java. Pocos productos usan etiquetas personalizadas de alguna manera creativa, proporcionando casi la misma funcionalidad antes de que aparecieran las bibliotecas de etiquetas personalizadas JSP.
La biblioteca de etiquetas OSCache, diseñada por OpenSymphony, es una innovadora aplicación de etiquetas JSP personalizadas que proporciona un rápido almacenamiento en caché de memoria dentro de páginas JSP existentes. Si bien hay algunos proveedores que ofrecen productos de almacenamiento en caché en diversas formas, todos son productos específicos del proveedor. OSCache puede ejecutarse en cualquier servidor compatible con JSP 1.1 y puede almacenar en caché bloques de código JSP existentes no sólo para todos los usuarios, sino también por usuario. OSCache también incluye algunas funciones avanzadas para mejorar la escalabilidad, como almacenamiento en búfer en disco, vaciado de búfer programable, control de excepciones, etc. Además, al igual que otros productos OpenSymphony, el código de OSCache se distribuye gratuitamente bajo una licencia de código abierto.
Este artículo toma como ejemplo un proceso de diseño de un sitio web de subasta imaginario para presentar el proceso de trabajo de OSCache. Este sitio web imaginario incluirá: una página de administración que informa sobre las actividades de subastas recientes; una página de inicio completamente funcional con diversa información promocional y una barra de navegación especial que contiene información sobre todas las actividades de subastas pendientes del usuario;
2. Página de administración
El sitio web de la subasta contiene un informe de administración y el servidor de la base de datos tarda varios segundos en crear dicho informe. Es importante que el informe tarde mucho en generarse, porque es posible que tengamos varios administradores monitoreando el funcionamiento del sistema y queremos evitar volver a generar el informe cada vez que el administrador nos visite. Para lograr esto, encapsularemos toda la página en una etiqueta de búfer a nivel de aplicación que se actualiza cada hora. Algunos productos de otros proveedores tienen una funcionalidad similar, solo que OSCache lo hace mejor que ellos.
En aras de la simplicidad, no nos centraremos demasiado en los problemas de formato. Al escribir la página de administración, primero agregamos la declaración de la biblioteca de etiquetas a la página:
<%@ taglib uri="cachetags" prefix="cache" %>
Luego tenemos que rodear toda la página con etiquetas de caché. El tiempo de caché predeterminado para las etiquetas de caché es 1 hora.
<cache:cache> .... Informes de administración complejos.... </cache:cache>
La página de administración ahora se ha almacenado en caché. Si el administrador vuelve a acceder a la misma página dentro de una hora después de generarla, verá la página previamente almacenada en caché y no es necesario que el servidor de la base de datos genere este informe nuevamente.
3. Página de inicio
La página de inicio del sitio web de subastas muestra las actividades del sitio web y promueve las subastas que están a punto de finalizar. Queremos mostrar la cantidad de subastas en curso, la cantidad de usuarios actualmente conectados, una lista de subastas que finalizarán en un futuro próximo y la hora actual. Estos mensajes tienen diferentes requisitos de precisión de tiempo. Las subastas en el sitio web suelen durar varios días, por lo que podemos establecer el tiempo para almacenar el número de subastas válidas en 6 horas. La cantidad de usuarios obviamente cambiará con más frecuencia, pero aquí almacenaremos este valor en buffer durante 15 minutos a la vez. Finalmente, queremos que la hora actual que se muestra en la página sea siempre la hora exacta en que se accedió a la página.
Después de declarar la biblioteca de etiquetas en la página de inicio, primero generamos la fecha actual directamente sin almacenamiento en búfer:
ahora es: <%=new java.util.Date()%>
A continuación, queremos mostrar una lista de aquellas que subastarán que finalizan en el corto plazo:
<cache:cache> <ul> <% // Construir un iterador que contenga las subastas más recientes Iterador subastas = .... while (auctions.hasMore()) { Subasta de subasta = (Subasta) subastas .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Finalmente, queremos mostrar el número de actividades de subasta en curso que se necesitan. para ser almacenado durante 6 horas. Dado que el marcado de caché requiere la cantidad de segundos para almacenar en caché los datos, convertimos 6 horas en 21600 segundos:
<cache:cache time="21600"> <% //Consulta la base de datos para obtener el número total de actividades de subasta int subastaCount = .. .. %> ¡Hay <%=auctionCount%> subastas en curso en este sitio web </cache>
Como puede ver, solo utilizamos una pequeña cantidad de código para construir una página de inicio con un complejo sistema de almacenamiento en búfer. Este sistema de almacenamiento en búfer almacena cada parte de la página por separado, y el tiempo de almacenamiento en búfer de cada parte es totalmente consistente con la frecuencia de cambios en su información respectiva. Gracias al almacenamiento en búfer, ahora podemos colocar más contenido en la página de inicio; sin el almacenamiento en búfer antes, colocar demasiado contenido en la página de inicio hará que el acceso a la página se ralentice e incluso puede causar problemas de carga excesiva en el servidor de la base de datos.
4. Barra de navegación
Supongamos que al planificar el sitio web, decidimos mostrar el contenido del carrito de compras debajo de la barra de navegación izquierda. Mostraremos el número de ofertas y el precio actual de cada artículo en la subasta por parte del usuario, así como una lista de todos aquellos artículos por los que el usuario actual tiene la oferta más alta.
Usamos capacidades de almacenamiento en búfer a nivel de sesión para construir la funcionalidad anterior en la barra de navegación. Coloque el siguiente código en la plantilla o incluya el archivo para que otras páginas del sitio web puedan hacer referencia a esta barra de navegación:
<cache:cache key="navbar" alcance="session" time="300"> <% //Extraer y mostrar la información de oferta actual%> </cache:cache>
Aquí presentamos dos atributos importantes, a saber, clave y alcance. En el código anterior de este artículo, dado que la etiqueta de caché puede crear automáticamente una clave única para el bloque de código, no necesitamos configurar este atributo de clave manualmente. Pero aquí queremos hacer referencia a este bloque de código almacenado en caché del resto del sitio, por lo que definimos explícitamente el atributo clave de la etiqueta de caché. En segundo lugar, el atributo de alcance se utiliza para indicarle al caché que marque que el bloque de código actual debe almacenarse en el búfer por usuario, en lugar de almacenarse en el búfer una vez para todos los usuarios.
Debe tener mucho cuidado al utilizar el almacenamiento en búfer a nivel de sesión y debe quedar claro: aunque podemos hacer que una barra de navegación compleja reduzca la carga del servidor entre 5 y 10 veces, aumentará considerablemente el espacio de memoria requerido por sesión. Sin duda, es ideal aumentar la cantidad de posibles usuarios concurrentes en términos de capacidades de CPU, pero una vez que la cantidad de usuarios concurrentes se reduce al límite de la CPU en términos de capacidades de soporte de memoria, esta solución ya no es ideal.
Como se mencionó anteriormente en este artículo, queremos hacer referencia a este bloque de código almacenado en el búfer del resto del sitio. Esto se debe a que cuando un usuario agrega un artículo para subasta o puja por artículos subastados por otros usuarios, queremos actualizar el búfer para que la barra de navegación tenga el contenido más reciente la próxima vez que se lea. Si bien estos datos pueden cambiar debido a la actividad de otros usuarios, puede resultar muy confuso para un usuario ver que su listado permanece sin cambios después de realizar una acción en el sitio.
La etiqueta de descarga proporcionada por la biblioteca OSCache puede actualizar el contenido del búfer. Podemos agregar el siguiente código a la página que maneja las acciones del usuario y puede afectar esta área:
<cache:flush key="navbar" alcance="session" />
La próxima vez que el usuario acceda a ella, el bloque del búfer de la barra de navegación se actualizará .
Hasta ahora, la construcción de nuestro sitio web de muestra se ha completado y puede comenzar a funcionar. Echemos un vistazo a las capacidades de manejo de excepciones de OSCache. Incluso si el contenido almacenado en el búfer se ha invalidado, como una excepción de Java que ocurre dentro del bloque del búfer, la biblioteca de etiquetas OSCache todavía nos permite mostrar el contenido mediante programación. Con esta función de control de excepciones, podemos interrumpir la conexión entre el servidor de la base de datos y el servidor web, y el sitio web aún podrá continuar ejecutándose. La especificación JSP 1.2 introdujo la interfaz TryCatchFinally, que permite que la propia etiqueta detecte y maneje excepciones de Java. Por lo tanto, el marcado se puede combinar con este código de manejo de excepciones para hacer que las páginas JSP sean más simples y organizadas.
OpenSymphony planea implementar mecanismos de almacenamiento en búfer adicionales, así como un sistema principal más manejable que nos permitirá administrar la RAM y el espacio en disco utilizado por el almacenamiento en búfer. Una vez que estas características estén implementadas, podremos mejorar aún más la capacidad de respuesta y confiabilidad del sitio web.
[Conclusión]
OSCache puede ayudarnos a construir sitios web más coloridos y de mayor rendimiento. Con la ayuda de la biblioteca de etiquetas OSCache, ahora podemos usarla para resolver algunos problemas que afectan la capacidad de respuesta del sitio web, como períodos pico de tráfico, servidores de bases de datos sobrecargados, etc.