1. Présentation
Dans les applications Web, la génération de certains rapports peut prendre beaucoup de temps pour que la base de données calcule ; certains sites Web fournissent des informations météorologiques, ce qui nécessite l'accès à un serveur distant pour effectuer un appel SOAP afin d'obtenir des informations sur la température. Ce sont tous des exemples d’informations complexes. L'ajout d'informations trop complexes à une page Web peut entraîner une surcharge du serveur Web et du serveur de base de données. La mise en mémoire tampon des blocs de code JSP donne aux développeurs la liberté d'ajouter toutes sortes d'informations complexes à volonté.
JSP peut encapsuler et exécuter du code Java complexe dans la bibliothèque de balises, ce qui facilite la maintenance des fichiers de page JSP et permet aux développeurs non professionnels d'utiliser plus facilement les fichiers de page JSP. Il existe déjà de nombreuses bibliothèques de balises, qui sont soit des produits commerciaux, soit des produits open source. Mais la plupart de ces produits utilisent uniquement des bibliothèques de balises pour implémenter des fonctions qui peuvent être implémentées avec un simple script Java. Peu de produits utilisent des balises personnalisées de manière créative, offrant presque les mêmes fonctionnalités qu'avant l'émergence des bibliothèques de balises personnalisées JSP.
La bibliothèque de balises OSCache, conçue par OpenSymphony, est une application de balises personnalisées JSP révolutionnaire qui fournit une mise en cache mémoire rapide dans les pages JSP existantes. Bien qu'il existe quelques fournisseurs proposant des produits de mise en cache sous diverses formes, il s'agit tous de produits spécifiques au fournisseur. OSCache peut s'exécuter sur n'importe quel serveur compatible JSP 1.1 et peut mettre en cache les blocs de code JSP existants non seulement pour tous les utilisateurs, mais également pour chaque utilisateur. OSCache comprend également certaines fonctionnalités avancées pour améliorer l'évolutivité, telles que la mise en mémoire tampon sur disque, le vidage de tampon programmable, le contrôle des exceptions, etc. De plus, comme d'autres produits OpenSymphony, le code d'OSCache est distribué gratuitement sous une licence open source.
Cet article prend comme exemple un processus de conception de site Web d'enchères imaginaire pour présenter le processus de travail d'OSCache. Ce site Web imaginaire comprendra : une page de gestion qui rend compte des activités d'enchères récentes ; une page d'accueil entièrement fonctionnelle avec diverses informations promotionnelles et une barre de navigation spéciale qui contient des informations sur toutes les activités d'enchères non réglées de l'utilisateur ;
2. Page de gestion
Le site Web d'enchères contient un rapport de gestion et il faut plusieurs secondes au serveur de base de données pour créer un tel rapport. Il est important que la génération du rapport prenne beaucoup de temps, car plusieurs administrateurs peuvent surveiller le fonctionnement du système et nous voulons éviter de régénérer le rapport à chaque visite de l'administrateur. Pour y parvenir, nous encapsulerons la page entière dans une balise tampon au niveau de l’application qui est actualisée toutes les heures. Certains produits d'autres fournisseurs ont des fonctionnalités similaires, mais OSCache le fait mieux qu'eux.
Par souci de simplicité, nous ne nous concentrerons pas trop sur les questions de formatage. Lors de l'écriture de la page de gestion, nous ajoutons d'abord la déclaration de la bibliothèque de balises à la page :
<%@ taglib uri="cachetags" prefix="cache" %>
Ensuite, nous devons entourer la page entière de balises de cache. La durée de cache par défaut pour les balises de cache est de 1 heure.
<cache:cache> .... Rapports de gestion complexes.... </cache:cache>
La page de gestion est maintenant mise en cache. Si l'administrateur accède à nouveau à la même page dans l'heure qui suit la génération de la page, il verra la page précédemment mise en cache et le serveur de base de données n'aura pas besoin de générer à nouveau ce rapport.
3. Page d'accueil
La page d'accueil du site Web d'enchères affiche les activités du site Web et fait la promotion des enchères sur le point de se terminer. Nous souhaitons afficher le nombre d'enchères en cours, le nombre d'utilisateurs actuellement connectés, une liste des enchères qui doivent se terminer dans un avenir proche et l'heure actuelle. Ces messages ont des exigences différentes en matière de précision temporelle. Les enchères sur le site Web durent généralement plusieurs jours, nous pouvons donc régler le temps nécessaire pour tamponner le nombre d'enchères valides à 6 heures. Le nombre d'utilisateurs changera évidemment plus fréquemment, mais ici nous mettrons en mémoire tampon cette valeur pendant 15 minutes à la fois. Enfin, nous voulons que l'heure actuelle affichée sur la page soit toujours l'heure exacte à laquelle la page a été consultée.
Après avoir déclaré la bibliothèque de balises dans la page d'accueil, nous affichons d'abord la date actuelle directement sans mise en mémoire tampon :
elle est maintenant : <%=new java.util.Date()%>
Ensuite, nous souhaitons afficher une liste de celles qui seront mises aux enchères. qui se terminent à court terme :
<cache:cache> <ul> <% // Construire un itérateur contenant les enchères les plus récentes Itérateur enchères = .... while (auctions.hasMore()) { Auction enchères = (Auction) enchères .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Enfin, nous souhaitons afficher le nombre d'activités d'enchères en cours dont ce numéro a besoin. à tamponner pendant 6 heures. Étant donné que le marquage du cache nécessite le nombre de secondes pour mettre les données en cache, nous convertissons 6 heures en 21 600 secondes :
<cache:cache time="21600"> <% //Interrogez la base de données pour obtenir le nombre total d'activités d'enchères int AuctionCount = .. .. %> Il y a <%=auctionCount%> enchères en cours sur ce site ! </cache>
Comme vous pouvez le voir, nous n'utilisons qu'une petite quantité de code pour construire une page d'accueil avec un système de mise en mémoire tampon complexe. Ce système de mise en mémoire tampon met en mémoire tampon chaque partie de la page séparément, et le temps de mise en mémoire tampon de chaque partie est entièrement cohérent avec la fréquence des changements dans leurs informations respectives. Grâce au buffering, nous pouvons désormais mettre plus de contenu sur la page d'accueil ; sans buffering auparavant, mettre trop de contenu sur la page d'accueil ralentira l'accès à la page, et peut même causer des problèmes pour le serveur de base de données.
4. Barre de navigation
Supposons que lors de la planification du site Web, nous décidions d'afficher le contenu du panier sous la barre de navigation de gauche. Nous afficherons le nombre d'offres et le prix actuel pour chaque article mis aux enchères par l'utilisateur, ainsi qu'une liste de tous les articles pour lesquels l'utilisateur actuel a l'enchère la plus élevée.
Nous utilisons des capacités de mise en mémoire tampon au niveau de la session pour construire la fonctionnalité ci-dessus dans la barre de navigation. Mettez le code suivant dans le modèle ou incluez le fichier afin que les autres pages du site Web puissent référencer cette barre de navigation :
<cache:cache key="navbar" scope="session" time="300"> <% //Extraire et afficher les informations sur l'offre actuelle%> </cache:cache>
Nous introduisons ici deux attributs importants, à savoir la clé et la portée. Dans le code plus haut dans cet article, puisque la balise de cache peut créer automatiquement une clé unique pour le bloc de code, nous n'avons pas besoin de définir cet attribut de clé manuellement. Mais ici, nous voulons référencer ce bloc de code mis en cache à partir du reste du site, nous définissons donc explicitement l'attribut key de la balise cache. Deuxièmement, l'attribut scope est utilisé pour indiquer au cache de marquer que le bloc de code actuel doit être mis en mémoire tampon pour chaque utilisateur, plutôt que de le mettre en mémoire tampon une fois pour tous les utilisateurs.
Vous devez être très prudent lorsque vous utilisez la mise en mémoire tampon au niveau de la session, et cela doit être clair : même si nous pouvons créer une barre de navigation complexe pour réduire la charge du serveur de 5x ou 10x, cela augmentera considérablement l'espace mémoire requis par session. Il est sans doute idéal d'augmenter le nombre d'utilisateurs simultanés possibles en termes de capacités du CPU, mais une fois que le nombre d'utilisateurs simultanés est réduit à la limite du CPU en termes de capacités de support mémoire, cette solution n'est plus idéale.
Comme mentionné plus tôt dans cet article, nous souhaitons référencer ce bloc de code mis en mémoire tampon à partir du reste du site. En effet, lorsqu'un utilisateur ajoute un article aux enchères ou enchérit pour des articles mis aux enchères par d'autres utilisateurs, nous souhaitons actualiser le tampon afin que la barre de navigation contienne le contenu le plus récent lors de sa prochaine lecture. Bien que ces données puissent changer en raison de l'activité d'autres utilisateurs, il peut être très déroutant pour un utilisateur de constater que son annonce reste inchangée après avoir effectué une action sur le site.
La balise de vidage fournie par la bibliothèque OSCache peut actualiser le contenu du tampon. Nous pouvons ajouter le code suivant à la page qui gère les actions de l'utilisateur et peut affecter cette zone :
<cache:flush key="navbar" scope="session" />
Lorsque l'utilisateur y accédera la prochaine fois, le bloc tampon de la barre de navigation sera actualisé .
Jusqu'à présent, la construction de notre exemple de site Web est terminée et peut commencer à fonctionner. Jetons un coup d'œil aux capacités de gestion des exceptions d'OSCache. Même si le contenu mis en mémoire tampon a été invalidé, comme une exception Java se produisant dans le bloc tampon, la bibliothèque de balises OSCache nous permet toujours d'afficher le contenu par programme. Avec cette fonctionnalité de contrôle des exceptions, nous pouvons supprimer la connexion entre le serveur de base de données et le serveur Web, et le site Web pourra toujours continuer à fonctionner. La spécification JSP 1.2 a introduit l'interface TryCatchFinally, qui permet à la balise elle-même de détecter et de gérer les exceptions Java. Par conséquent, le balisage peut être combiné avec ce code de gestion des exceptions pour rendre les pages JSP plus simples et plus organisées.
OpenSymphony prévoit d'implémenter des mécanismes de mise en mémoire tampon supplémentaires ainsi qu'un système principal plus gérable qui nous permettra de gérer la RAM et l'espace disque utilisés par la mise en mémoire tampon. Une fois ces fonctionnalités mises en place, nous pourrons encore améliorer la réactivité et la fiabilité du site internet.
[Conclusion]
OSCache peut nous aider à créer des sites Web plus colorés et plus performants. Avec l'aide de la bibliothèque de balises OSCache, nous pouvons désormais l'utiliser pour résoudre certains problèmes qui affectent la réactivité du site Web, comme les périodes de pointe de trafic, les serveurs de bases de données surchargés, etc.