Infrastructure Web
Le cache Web ASP.NET favorise performances et évolutivité
Iqbal Khan
Vue d'ensemble :
-
Réduction considérable des goulots d'étranglement
-
Mise en cache Web statique et dynamique
-
Fonctionnalités indispensables : expirations, dépendance des bases de données, contenu PDF partiel, etc.
-
Avantages spécifiques pour les organisations internationales
-
Clusters de serveurs de cache Web
-
Solutions gratuites et commerciales
Les applications basées sur ASP.NET, l'infrastructure d'application Web de Microsoft, pénètrent de plus en plus l'entreprise.
En même temps, les goulots d'étranglement résultant du nombre croissant d'utilisateurs et de transactions continuent de pousser les informaticiens à demander des performances et une évolutivité supérieures.
Le problème : des goulots d'étranglement ASP.NET
Les goulots d'étranglement peuvent se produire dans les applications ASP.NET pour diverses raisons.
La plus évidente : la technologie de stockage des données n'est pas aussi évolutive que l'architecture des applications Web.
Tout élément d'une application ASP.NET impliqué dans le stockage des données ou l'accès aux données pose immédiatement problème lorsque vous essayez de faire évoluer l'application.
Deux domaines où cela se produit sont les données de stockage d'état de session et les données d'application d'une base de données relationnelle ou pour macroordinateur (voir Figure 1).
Figure 1 Lieux courants de goulots d'étranglement des performances dans les applications ASP.NET.
Un autre goulot d'étranglement se produit si votre application ASP.NET effectue des appels SOA (architecture orientée services) aux services Web.
Ici, le ralentissement se produit parce que les services Web ont les mêmes problèmes que votre application ASP.NET (à savoir, des problèmes de stockage et d'accès aux données).
Il est probable qu'une batterie de serveurs de services Web est partagée entre plusieurs applications et se trouve par conséquent beaucoup plus sollicitée qu'une application ASP.NET, ce qui crée un goulot d'étranglement pour l'évolutivité.
Les goulots d'étranglement peuvent également se produire entre le navigateur de l'utilisateur et la batterie de serveurs Web ASP.NET.
Ces engorgements sont liés au fait que les pages ASP.NET doivent parfois être exécutées de façon répétée, ce qui implique une forte consommation des ressources processeur.
Ce processus implique également l'envoi répété d'éléments de données volumineux (images, documents, etc.) à l'utilisateur.
Dans un précédent article de TechNet Magazine, j'ai abordé les problèmes de performances et d'évolutivité d'ASP.NET surtout à propos des données d'état de session et des données d'application (voir « Assurer l'évolutivité des applications ASP.NET ", juin 2009).
Dans cet article, j'expliquais comment ces difficultés surviennent et pourquoi l'état de session devient un problème en cas d'extension d'une batterie de serveurs Web.
J'ai évoqué l'idée que le cache distribué en mémoire était une meilleure solution que l'option de stockage existante de Microsoft pour l'état de session ASP.NET.
J'ai décrit comment les données d'application provenant d'une base de données pouvaient entraîner des goulots d'étranglement pour l'évolutivité.
J'ai également détaillé la façon dont le cache distribué résolvait ces engorgements du stockage de l'état de session ASP.NET à l'aide de différentes topologies de mise en cache offrant chacune différentes fonctionnalités, mais résolvant toutes les problèmes d'évolutivité et garantissant une disponibilité à 100 %.
Enfin, j'ai dressé un profil générique des différentes options de mise en cache distribué disponibles sur le marché.
Certaines options sont gratuites, avec des fonctionnalités limitées, tandis que d'autres sont des produits commerciaux plus performants et plus complets.
Toutefois, pour optimiser les performances et évolutivité, il est prudent d'envisager des produits commerciaux haut de gamme.
La solution : le cache Web ASP.NET
Gardant ce problème posé en toile de fond, cet article s'attache principalement aux goulots d'étranglement des performances et de l'évolutivité entre le navigateur de l'utilisateur et le serveur ou la batterie de serveurs Web.
Dans l'idéal, il est souhaitable de réduire le nombre d'exécutions de la page Web.
Si la page Web est exécutée une fois et que son résultat ne change pas, même brièvement, pourquoi l'exécuter à nouveau ?
Pourquoi ne pas simplement mettre son résultat en cache ?
La fois suivante, il suffira à l'utilisateur d'extraire le résultat de cette page directement du cache, sans l'exécuter une nouvelle fois.
La ré-exécution de la page implique le processeur, consomme de la mémoire et utilise d'autres ressources du serveur Web. Ensuite, bien sûr, se posent les problèmes de goulot d'étranglement au niveau de l'évolutivité, dus au stockage des données.
Un résultat de page ASP.NET peut être mis en cache sur le serveur Web lui-même ; pour cela, Microsoft fournit un mécanisme efficace de cache de résultat ASP.NET.
Cependant, ce cache de résultat ASP.NET me préoccupe pour deux raisons.
Tout d'abord, il exige de modifier votre code ASP.NET et, au minimum, de placer des balises sur ces pages pour indiquer que vous souhaitez mettre leur résultat en cache.
Cela n'est pas toujours possible pour un informaticien qui doit gérer à la fois les applications ASP.NET développées en interne et celles achetées dans le commerce.
Chaque fois que vous modifiez votre code d'application, vous devez faire des travaux d'assurance qualité pour vérifier que rien n'a été perturbé dans le processus.
Cela augmente le coût d'intégration de la mise en cache.
Deuxièmement, le cache de résultat ASP.NET met en cache le résultat de page local de chaque serveur Web et, en fait, de chaque processus de travail d'ASP.NET.
Cela crée des problèmes majeurs en termes de cohérence et d'évolutivité si vous avez un domaine Web privé (c'est-à-dire plusieurs processus de travail sur un serveur Web) ou une batterie de serveurs Web à charge équilibrée.
Dans ce cas, vous avez plusieurs copies déconnectées du cache ; pour les sites Web à fort trafic, leur gestion peut devenir un cauchemar.
Dans ASP.NET 4.0, Microsoft promet une infrastructure de mise en cache extensible qui permet de conserver le cache dans un processus ou un niveau distinct en incorporant un cache tiers distribué.
Au vu de ce développement, je préfère que le résultat du cache de page ne réside pas sur le serveur Web, mais sur un serveur de cache Web distinct placé entre les utilisateurs et votre batterie de serveurs (un peu comme un proxy inverse ; voir la Figure 2).
Si de nombreuses requêtes de l'utilisateur ne parviennent pas à la batterie de serveurs Web et proviennent d'un cache placé au milieu, vous réduisez la charge sur votre batterie de serveurs Web et améliorez son évolutivité.
Extraire du cache le résultat d'une page Web et le renvoyer à l'utilisateur nécessite beaucoup moins de ressources que l'exécution réelle de cette page Web.
C'est parce que le cache est un stockage en mémoire très performant et évolutif, contrairement au stockage sur disque qui peut poser des problèmes de performances et d'évolutivité.
Figure 2 Serveurs de cache Web situés entre les utilisateurs et les serveurs Web.
Dans ce contexte, nous étudierons comment la mise en cache du résultat des pages Web peut résoudre les goulots d'étranglement et améliorer considérablement l'évolutivité et les performances.
Un serveur de cache Web peut jouer un rôle important pour atteindre ces objectifs.
Un serveur de cache Web intercepte les requêtes http de pages Web provenant des utilisateurs et vérifie si le résultat de ces pages existe déjà dans le cache.
Si tel est le cas, le serveur de cache Web renvoie ce résultat à l'utilisateur.
La demande de l'utilisateur ne parvient même pas aux serveurs Web.
Le retour est extrêmement rapide puisque le résultat est extrait du cache.
La page se trouvant dans la mémoire, elle n'a pas besoin d'être réexécutée, ce qui économise considérablement le traitement processeur.
Un serveur de cache Web peut fonctionner avec n'importe quelle plate-forme de technologie Web back-end.
Tant que ces plates-formes n'utilisent pas HTML et JavaScript, peu importe que l'application Web soit développée en Java, .NET, PHP ou un autre langage.
En revanche, un serveur de cache Web peut inclure certaines fonctionnalités spécifiques à la plate-forme. Les fonctionnalités peuvent donc différer d'une solution à une autre.
Il existe deux types de solutions de mise en cache Web.
On met principalement en cache des données relativement statiques, ce qui signifie que chaque page mise en cache est censée être totalement statique ou modifiée à des intervalles prévisibles.
La page entière est mise en cache pendant un certain temps, après quoi elle expire et est supprimée du cache.
L'autre type concerne la mise en cache dynamique, plus appropriée pour des sites Web ou des applications Web dynamiques.
Si votre application ou votre site Web est dynamique, avec des données qui changent fréquemment et de façon imprévisible, vous devez opter pour une mise en cache dynamique.
De nos jours, la plupart des sites Web modifient fréquemment au moins une partie de leur contenu.
Vous devez pouvoir mettre du contenu en cache pour de courtes durées, de 15 à 30 secondes, mais normalement pour des durées de quelques minutes à quelques heures et, dans certains cas, de plusieurs jours, voire de plusieurs semaines.
La mise en cache Web offre un avantage considérable aux grandes entreprises internationales : la possibilité de répartir géographiquement les serveurs de mise en cache Web.
Dans une entreprise mondiale, votre application de site principal peut être hébergée à New York, mais être utilisée par des utilisateurs du monde entier, à San Francisco, Londres, Tokyo, Sydney ou Dubaï.
Maintenant, il est relativement facile de placer géographiquement des serveurs Web de mise en cache dans chacune de ces régions.
Toutes les demandes provenant d'Europe passeront par le serveur de cache Web européen avant d'atteindre votre site Web.
Elles n'auront ainsi pas à traverser l'Océan Atlantique et supporter la latence de 100 millisecondes que chaque paquet doit subir.
Elles peuvent en réalité obtenir une copie depuis un cache situé à proximité.
Prenons un autre exemple.
Vous avez un serveur à Dubaï desservant les régions du Moyen-Orient et de l'Asie méridionale et des centaines de milliers d'utilisateurs accédant simultanément à votre site Web.
Avec la mise en cache Web, le trafic vers votre centre de données principal de New York chute considérablement.
Tout le trafic n'est pas arrêté, car vous ne mettez pas tout en cache, et tout ce que vous mettez en cache est également supprimé du cache (autrement dit invalidé) de temps à autre.
Mais selon la nature de votre application, vous aurez probablement réduit le trafic de 30 à 50 pour cent.
Fonctionnalités indispensables du cache Web
Au fil du temps, les sites Web se sont transformés. Affichant tout d'abord uniquement du contenu statique, ils sont devenus des applications Web entièrement interactives, avec des données dynamiques qui changent fréquemment.
Cela signifie qu'un cache Web doit aujourd'hui répondre à toutes les exigences d'un site Web dynamique.
L'objectif est de mettre en cache la plus grande partie possible du contenu du site Web, tout en s'assurant que le contenu mis en cache est correct, non périmé ou hors de synchronisation avec les données sous-jacentes de la base de données.
Pour gérer tout cela, le cache Web doit posséder certaines fonctionnalités qui lui permettent d'éviter les problèmes d'intégrité des données tout en accélérant les performances et l'évolutivité.
Une solution type de cache Web inclut les fonctionnalités suivantes.
Délais d'expiration
La fonctionnalité d'expiration permet de spécifier des règles déterminant quelles pages Web mettre en cache et pour quelle durée.
Elle vous permet aussi de faire expirer les pages à un moment donné, en temps absolu ou décalé.
Un temps absolu signifie que vous souhaitez faire expirer quelque chose à un moment donné, que ce soit minuit aujourd'hui ou dans 10 minutes.
Le temps décalé dépend de si une certaine page est utilisée en permanence.
Si une page n'est pas en cours d'utilisation (si elle n'est pas utilisée du tout), vous souhaiterez peut-être la faire expirer.
Un délai d'inactivité fera expirer une page si elle reste inutilisée plus d'un certain temps, par exemple 10 ou 20 minutes.
L'expiration en temps absolu est probablement le temps d'expiration le plus important pour une page Web.
Les produits de mise en cache Web permettent de spécifier des règles et de choisir quels modèles d'URL (appelés "URI") mettre en cache.
La mise en cache Web vous permet de spécifier que certaines URL ne doivent jamais être mises en cache.
Elle permet de spécifier certains types d'URL à mettre en cache pendant un certain temps.
Elle doit également permettre de spécifier quand faire expirer diverses URL en fonction des informations figurant dans les en-têtes HTTP qui accompagnent le résultat de ces URL.
Chaque en-tête HTTP de page peut contenir des informations sur la durée de mise en cache à respecter, l'heure d'expiration et l'heure de la dernière modification de la page.
Ce sont des éléments que le cache Web peut vérifier pour contrôler si le contenu d'une page a été modifié et s'il faut télécharger un nouveau contenu dans le cache.
Sans cette fonctionnalité, vous n'avez aucun moyen d'invalider et de supprimer les données périmées.
Rechargement des pages à expiration
Une autre fonctionnalité importante est la possibilité de recharger automatiquement une page lorsqu'elle expire pour une raison quelconque, que l'expiration soit fixée en temps absolu ou en durée d'inactivité.
Par exemple, vous pouvez dire : « Cette page est bonne pour les 20 prochaines minutes ». Après 20 minutes, le cache Web ira chercher à nouveau cette page automatiquement afin de toujours disposer de la dernière copie.
De cette manière, vous n'avez pas à attendre la prochaine demande de l'utilisateur pour cette page.
En effet, lorsque cette demande arrive, vous ne souhaitez pas que l'utilisateur subisse un délai dû à l'extraction de la page depuis la batterie de serveurs Web.
Puisque vous pouvez l'extraire en arrière-plan, cela peut vous prendre 5 à 10 secondes pour l'extraire du serveur Web en l'exécutant auparavant.
Mais cela n'est pas un problème, car d'ici à ce que l'utilisateur l'ait reçue, vous pourrez la renvoyer avec un temps de réponse inférieur à la seconde, selon l'éloignement de l'utilisateur.
Cache de page partielle
Certaines des pages qui apparaissent dans un navigateur contiennent plusieurs éléments qui ont chacun leur propre URL.
Par conséquent, pour restituer une page, le navigateur Web doit appeler plusieurs URL.
Cela donne le même résultat qu'une page partielle, mais sans la dénomination de « page partielle » car du côté serveur, chaque URL représente une page distincte et chaque page est mise en cache indépendamment et pour une durée différente, selon la nature de son contenu.
Dans d'autres situations, une page Web unique est développée de telle manière que son contenu soit divisé en sections.
Certaines sections sont statiques et ne changent pas ; certaines parties sont dynamiques, chaque partie étant modifiée après un intervalle différent.
En effet, la mise en cache de page partielle met en cache les sections de pages selon qu'elles sont statiques ou dynamiques et selon la durée de conservation en cache préconisée, plutôt que de mettre simplement en cache la page entière.
ASP.NET vous permet d'effectuer une mise en cache partielle de deux manières : la mise en cache de contrôles et la substitution post-cache.
Toutes deux vous obligent à modifier les pages ASP.NET spécifiques que vous souhaitez mettre en cache.
Cela risque d'être impossible si vous ne disposez pas de vos propres ressources de développement et si vous n'avez pas développé cette application ASP.NET en interne.
Néanmoins, voici une description de chaque type de mise en cache de page partielle dans ASP.NET.
Vous pouvez effectuer une mise en cache de page partielle dans ASP.NET en créant des contrôles utilisateur pour contenir le contenu mis en cache et en marquant ces contrôles comme « pouvant être mis en cache ». Cela permet de mettre en cache certaines parties de la page en tant que contrôles utilisateur afin que lorsque la page est réexécutée, ces parties soient simplement extraites du cache et non réexécutées.
Seules les parties de la page qui ne sont pas désignées comme des contrôles utilisateur et ne sont pas marquées comme « pouvant être mises en cache » sont réexécutées.
Avec la substitution post-cache, la page est mise en cache, mais certaines parties ou fragments qu'elle contient sont marqués comme étant « dynamiques » ou « à ne pas mettre en cache ». Lorsque cette page est réexécutée, seules les parties dynamiques ou à ne pas mettre en cache sont réellement exécutées.
Le reste de la page est obtenu à partir du cache et les parties mises en cache et dynamiques sont combinées pour renvoyer le résultat de la page.
Il est intéressant de noter que la mise en cache de page partielle ne peut être effectuée que sur le serveur Web.
C'est pourquoi un peu de programmation est nécessaire.
Dans le cas d'ASP.NET, la mise en cache de page partielle s'effectue avec une programmation dans les pages ASP.NET visant à déterminer celles à mettre ou non en cache.
Mais cette mise en cache est effectuée sur le serveur Web lui-même et exécute toujours la page ASP.NET, au moins partiellement.
Dans ASP.NET, la mise en cache de page partielle est implémentée selon les spécifications de Microsoft, mais sur la plate-forme Java, une norme de mise en cache de page partielle appelée Edge Service Includes (ESI) a émergé.
ESI définit un langage de balisage simple basé sur XML qui définit des composants de pages Web pouvant ou non être mis en cache, pouvant être agrégés, assemblés et transmis à la périphérie du réseau, qu'il s'agisse d'un réseau de fourniture de contenu, du navigateur d'un utilisateur final ou d'un serveur de cache Web agissant comme un proxy inverse entre les navigateurs des utilisateurs et le serveur Web.
Ainsi, la mise en cache de page partielle est très spécifique à la plate-forme et, bien sûr, pour ASP.NET, vous devez utiliser l'approche de Microsoft.
Dépendance des bases de données
Une autre fonctionnalité clé est la dépendance de la base de données, qui permet d'invalider un résultat de page dans le cache lorsque les données correspondantes changent dans la base de données.
Les résultats de pages sont souvent générés d'après les données de la base de données.
Les données qu'ils représentent proviennent d'une ou plusieurs lignes dans une ou plusieurs tables de base de données.
Par conséquent, si les lignes sont modifiées, ces pages doivent être supprimés du cache.
Pour cette raison, la synchronisation de la base de données est une fonctionnalité importante.
Cela signifie que lorsque les données changent dans la base, ces résultats de pages doivent être invalidés et supprimés du cache.
Cette fonctionnalité permet de déterminer automatiquement si certaines pages doivent être supprimés du cache.
Une façon de créer cette dépendance consiste à spécifier une instruction SQL "select" (ou un appel de procédure stockée contenant une instruction select) qui correspond à la page en question, puis à mapper certains des paramètres GET/POST de la page avec les paramètres de l'instruction SQL.
Au moment de l'exécution, les paramètres de la page Web sont utilisés pour exécuter l'instruction SQL et un SqlCacheDependency est créé sur une base de données SQL Server 2005/2008 ou Oracle 10 g R2, ou une version ultérieure.
Ainsi, lorsque la ligne correspondante change dans la base de données, le serveur de base de données déclenche un événement .NET capturé par le serveur de cache Web.
Le résultat de la page correspondante est alors supprimé du cache (voir la figure 3).
Figure 3 Page supprimée du cache Web si la ligne de la base de données change.
Dépendance des fichiers
Une autre fonctionnalité clé est la dépendance des fichiers.
Vous pouvez associer une sortie de page à un fichier du système avec les instructions : "Si ce fichier est déjà mis à jour ou supprimé, invalider cette page." Le cache Web contrôle ensuite ce fichier, qui est conservé dans un dossier partagé.
Si ce fichier est déjà mis à jour ou supprimé, le cache Web invalide automatiquement l'URL correspondante dans le cache.
Cela permet de mettre à jour des fichiers depuis n'importe quel point du système, même si cela implique une autre application, voire un déclencheur dans le serveur de base de données, en fonction du moment où certaines données connexes sont modifiées.
Par exemple, si vos données sont stockées sur un ordinateur central plutôt que dans des bases de données SQL 2005/2008 ou Oracle, vous pouvez utiliser une dépendance de fichier pour invalider une page de cache.
Tout cela permet d'indiquer au cache quand procéder à une invalidation si certaines choses se produisent dans votre banque de données ou dans votre environnement et si le cache Web ne peut pas directement y accéder.
Contenu PDF partiel
De nombreux utilisateurs accèdent désormais en ligne à des fichiers PDF.
Le modèle d'utilisation courante est de lire une page à la fois, en parcourant tout le fichier PDF page par page.
Peu de gens téléchargent un PDF entier pour le lire en local ; la plupart le lisent dans leur navigateur.
Lorsqu'ils visualisent les informations de cette façon, ils ne lisent généralement pas la totalité du document mais l'abandonnent après en avoir lu une partie.
Fournir le document en entier est donc souvent une perte de ressources ; en fait, c'est peut-être un facteur déterminant entre des performances acceptables et inacceptables aux heures de pointe.
Pour cette raison, la gestion de contenu PDF partiel est une fonctionnalité importante pour un cache Web.
Elle réduit la charge de bande passante sur le serveur Web et améliore l'évolutivité globale.
Mise en cache de ViewState
Parmi les fonctionnalités les plus importantes d'ASP.NET figure la possibilité de déclarer des contrôles qui s'exécutent sur le serveur et sont republiés sur la même page.
Avant ASP.NET, dans l'ASP classique, vous finissiez par créer plusieurs pages pour gérer différentes opérations qui, logiquement, appartenaient à une même page, par exemple, le chargement des données, leur enregistrement ou d'autres actions.
Dans ASP.NET, cela n'est plus nécessaire.
Les champs de formulaires et autres contrôles peuvent maintenant être déclarés comme s'exécutant sur le serveur et le serveur republie simplement la page sur elle-même.
Pour gérer ces renvois, un ViewState est créé. Il mémorise l'identité des contrôles et toutes les informations dynamiques affectées à ces contrôles.
Par essence, ViewState conserve l'état des contrôles d'une page dans plusieurs publications.
ViewState est important pour les applications ASP.NET.
Fondamentalement, il s'agit d'informations envoyées par le serveur Web au navigateur pour que ce dernier puisse renvoyer ces mêmes informations au serveur la prochaine fois que l'utilisateur publiera la même page.
Par exemple, vous pouvez charger un client sue la page customer.aspx.
Vous pouvez ensuite modifier les données du client et cliquer sur "Enregistrer". Le bouton Enregistrer rappelle customer.aspx, mais transmets également le ViewState afin que le customer.aspx sache comment gérer ce renvoi.
Le ViewState contient les informations que customer.aspx a envoyées au navigateur et le renvoi contient les nouvelles données que l'utilisateur a peut-être modifiées.
Cela permet à customer.aspx de déterminer ce qui a changé et quoi en faire.
Cela n'est qu'un exemple simple ; ViewState peut également contenir d'autres données créées dynamiquement pour chaque contrôle de la page.
Bien que ViewState soit très utile dans ASP.NET, il entraîne également le coût du transfert aller-retour des données entre un serveur Web et le navigateur de l'utilisateur.
Ce coût peut avoir un impact sur les performances et l'évolutivité lors des pics de charges de l'application, ou lorsque les utilisateurs sont loin du serveur Web et n'ont qu'une connexion Internet lente.
Mais le ViewState n'a que rarement à faire tout le chemin jusqu'au navigateur s'il peut être mis en cache dans le cache Web.
Dans ce cas, il suffit d'envoyer une balise ou un ID unique au navigateur afin que si ce dernier revient, le cache Web réinsère un ViewState et le renvoie au serveur Web d'après cet ID unique.
Tout ce qu'il faut à un serveur Web, c'est que la prochaine fois que le navigateur envoie la demande, il contienne le ViewState de la fois précédente.
Peu importe que le ViewState atteigne le navigateur car celui-ci n'utilise jamais ces informations ; seul le serveur Web s'en sert.
En termes techniques, un ViewState sert aux republications. Si vous les utilisez, il vous faut un ViewState, sachant qu'un cache Web peut mettre un ViewState en cache.
Cela économise également beaucoup de bande passante, car un ViewState ne pèse que quelques kilo-octets.
Compression gzip
De nos jours, la plupart des navigateurs peuvent décompresser le contenu compressé gzip.
Mais tous les serveurs Web ne sont pas configurés pour compresser automatiquement le résultat des pages Web.
Et même si la compression est activée, elle consomme inutilement beaucoup de ressources processeur sur chaque serveur Web, alors que ces derniers sont déjà sollicités par un trafic important.
Cependant, si la compression est effectuée par un serveur de cache Web proxy intermédiaire, elle devient plus évolutive.
Il est plus facile de compresser des données statiques qui ne changent jamais.
Toutefois, la plupart des pages d'une application ASP.NET sont dynamiques et leur contenu ne doit être compressé que si le résultat de la page ne change pas chaque fois.
Dans le cas contraire, la compression pèsera excessivement sur le processeur et réduira peut-être à néant les gains d'utilisation de la bande passante.
Mais, comme un cache Web sait déjà intelligemment déterminer quel résultat de page dynamique peut être mis en cache (autrement dit, un résultat qui ne change pas pendant au moins un court laps de temps), il est également capable de compresser automatiquement les pages du cache.
Ensuite, ces pages mises en cache sont servies à plusieurs reprises aux clients sous forme compressée, ce qui réduit considérablement l'utilisation de la bande passante.
Une compression gzip standard réduit le contenu de près de 80 %, à moins que le contenu ne soit déjà compressé (par exemple, PDF, JPEG, TIFF, etc.).
Un bon cache Web doit permettre à l'utilisateur de spécifier les URL à compresser ou à ignorer lors de la compression.
Cluster de cache Web évolutif et dynamique
Un cache Web est un serveur placé devant une batterie Web ASP.NET (presque comme un système).
Aujourd'hui, les batteries de serveurs Web ASP.NET peuvent aller de 2 à plus de 100 serveurs avec un équilibreur de charge.
Par conséquent, un serveur de cache Web unique est incapable de gérer la charge d'une batterie en pleine expansion.
Une règle empirique est que pour cinq serveurs Web dans une batterie de serveurs, il faut un serveur de cache Web.
Disposer de plusieurs serveurs de cache Web améliore non seulement l'évolutivité, mais permet également au cache Web de se répliquer. Ainsi, si un serveur tombe en panne ou est retiré, le cache n'est pas perdu et il n'y a aucune dégradation des performances (voir la figure 4).
Figure 4 Cluster de cache Web dynamique (ajout ou suppression de serveurs en cours d'exécution).
Un bon serveur de cache Web doit pouvoir créer un cluster de serveurs de mise en cache Web afin de garantir la fiabilité grâce aux capacités de réplication et d'évolutivité qu'offre la présence de plusieurs serveurs.
Quel que soit le nombre de serveurs de mise en cache Web impliqués, ils restent toujours considérés comme un seul cache Web logique.
Même s'il existe plusieurs copies du cache dans le cluster, elles restent toujours synchronisées.
En bref, un cluster de serveurs de mise en cache Web permet d'évoluer tout en conservant la précision logique du cache.
Une fois que vous avez un cluster de cache, un bon cache Web doit vous permettre de spécifier différentes options de stockage en cache, également appelées topologies de mise en cache.
Les principales topologies sont le cache répliqué, le cache partitionné et le cache client.
Un cache partitionné signifie que le cache entier est copié sur chaque serveur de cache du cluster.
Par conséquent, chaque serveur de cache possède le cache entier.
Tous les opérations « get » sont toujours locales à chaque serveur et, par conséquent, très rapides.
Toutefois, les mises à jour sont effectuées sur plusieurs serveurs de cache, et s'il existe plus de deux serveurs de ce type dans le cluster, le coût des mises à jour augmente.
De son côté, le cache partitionné décompose (ou partitionne) le cache, stockant chaque partition sur un serveur de cache différent.
Le nombre de partitions est égal au nombre de serveurs de cache.
Ainsi, vous pouvez augmenter la capacité de stockage du cache en ajoutant plusieurs serveurs de cache, ce que vous ne pouvez pas faire avec un cache répliqué.
Le cache partitionné vous permet de créer des sauvegardes de chaque partition sur un serveur de cache différent afin de ne pas perdre le cache si l'un de ces serveurs tombe en panne.
Le cache partitionné est la topologie de mise en cache la plus évolutive pour le stockage et le nombre de transactions par seconde.
Enfin, le cache client est une topologie qui se combine avec le cache partitionné ou répliqué (surtout si le cache réel est hébergé sur un autre serveur que le serveur de cache Web).
Le cache client conserve un petit sous-ensemble du cache dans le processus client de sorte que les données fréquemment utilisées soient toujours disponibles à proximité.
Ce qui est conservé dans le cache client dépend de que ce client a récemment extrait.
Vous pouvez spécifier une taille maximale pour le cache client afin que lorsqu'il atteint cette taille, il commence à écarter (ou supprimer) les anciens éléments pour libérer de l'espace pour les nouveaux.
De cette façon, le cache client ne consomme jamais plus de mémoire que ce que vous avez déterminé comme étant possible.
Si vous utilisez plusieurs serveurs de cache Web sans créer de cluster de cache, vous obtenez plusieurs copies déconnectées du cache.
Ce résultat peut être acceptable si votre site Web est relativement statique, mais pour des sites Web dynamiques et des applications ASP.NET, cela peut provoquer des problèmes d'intégrité des données.
En outre, vous enverrez finalement la demande de l'utilisateur au serveur Web même si un autre serveur de cache Web possède le résultat de cette page dans le cache, ce qui augmente la charge sur la batterie de serveurs Web ASP.NET.
Distribution géographique du cache
De nombreux sites Web d'applications ASP.NET ont aujourd'hui des utilisateurs dans le monde entier, même si le site Web proprement dit est hébergé à un seul endroit.
Il est souvent impossible pour le site Web de se trouver à plusieurs emplacements géographiques en raison de la complexité et du coût de son infrastructure.
Par exemple, une batterie de serveurs Web ASP.NET doit également disposer d'un serveur de base de données au même endroit ; les serveurs de bases de données sont en général mal adaptés à une distribution géographique lorsqu'ils impliquent des applications fortement transactionnelles.
Par conséquent, les utilisateurs finaux se heurteront à un ralentissement des performances dû à la latence du réseau étendu (WAN).
Une façon de résoudre ce problème consiste à placer les serveurs de cache Web dans chaque emplacement géographique, puis à acheminer le trafic de cette zone via le serveur de cache Web le plus proche (voir la figure 5).
Si un serveur de cache Web ne possède pas une page déjà mise en cache, il envoie directement la requête au centre de données principal, où se trouve un autre jeu de serveurs de cache Web.
Figure 5 Serveur de cache Web dans un environnement géographiquement distribué.
Un bon cache Web doit donc pouvoir créer une hiérarchie entre les serveurs pour que chaque cache Web sache où acheminer la demande, même s'il ne possède pas la page mise en cache.
Rester loin de la base de données
Comme je l'écrivais dans mon article de juin 2009, les données ne changent pas à chaque fois ; elles restent constantes.
Malheureusement, sans mise en cache distribuée, vous passez par des cycles inutiles pour reproduire maintes et maintes fois ces mêmes données.
Mais vous n'avez pas tout le temps à accéder à la base de données.
Ce sont les mêmes données, alors pourquoi faire ?
Pourquoi ne pas les prendre dans le cache ?
Voici un exemple qui met ce problème en évidence.
La page Web principale d'une compagnie aérienne change peu ; elle peut être mise en cache pour une longue période.
Un client s'y rend pour rechercher des vols.
Les informations changent constamment car comme d'autres utilisateurs réservent des places, les informations changent sur le système back end.
Si le client recherche, par exemple, un vol New York - San Francisco, la disponibilité des places détermine les résultats.
Cette disponibilité dépend du nombre de voyageurs déjà enregistrés, des réservations étant prises en permanence.
Un vendeur surmené peut compliquer les choses en saisissant des informations incorrectes ou en effectuant plusieurs entrées pour valider une attribution de place.
L'utilisateur reçoit les résultats indiquant qu'un vol particulier est disponible, avec des informations qui sont modifiées dans le cache toutes les cinq minutes.
Mais dès que le client souhaite réellement réserver une place, une vérification en temps réel est effectuée dans la base de données.
En effet, pour 1 000 personnes qui vérifient la disponibilité d'un vol, il est probable qu'environ 10 seulement effectueront réellement une réservation.
C'est très bien d'afficher la disponibilité des vols pour tous ces visiteurs, même si les informations fournies risquent de ne pas être entièrement correctes.
Dans ce type de situations, vous pouvez mettre cette page en cache même si elle est hautement dynamique.
Mais vous pouvez la mettre en cache en jugeant qu'il est acceptable de fournir des informations qui risquent de ne pas être complètement exactes.
Toutefois, sur la page des réservations de la base de données, il est essentiel de garantir que toutes les informations sont précises et à jour.
Ce qui se passe ici, c'est que chaque application possède des informations communes qui peuvent être mises en cache, et qu'il n'est pas nécessaire d'adresser chaque fois un utilisateur du site Web à la base de données de la compagnie aérienne.
L'étape la plus simple a lieu lorsque vous souhaitez mettre en cache toutes les images.
Vous ne modifiez pas le logo de votre société ou l'image de votre président, ni les documents standard que vous mettez à la disposition des visiteurs.
Mais il y a d'autres parties plus dynamiques.
C'est à ce moment que vous pouvez spécifier des règles et dire, par exemple, « je veux mettre cette page en cache pour telle durée".
Pour d'autres pages, vous pouvez, par exemple, dire : « Je ne sais pas combien de temps elle sera mise en cache, donc je veux la relier à la base de données.
Si telle ligne de cette table est modifiée, je veux que cette page soit invalidée ". Cela signifie la retirer du cache et la recharger, en créant une nouvelle copie.
Chaque catégorie de page est différente.
Du moment qu'un cache Web vous permet de déterminer comment vous souhaitez placer les pages en cache, vous créez une situation dans laquelle plus vous mettez en cache et moins vous accédez à la batterie de serveurs Web.
Instructions
Dans la plupart des cas, vous pouvez obtenir des avantages significatifs en déployant un cache Web.
Si vous n'avez qu'un seul serveur Web, il est probable que vous n'avez pas assez de trafic pour rencontrer ce type de problèmes.
Mais si vous avez 1 000 utilisateurs ou plus, vous avez probablement déjà une batterie avec équilibrage de charge.
Dans ce cas, il peut être intéressant pour vous de rechercher des moyens d'optimiser les performances et l'évolutivité.
Planifiez.
N'attendez pas que les problèmes surviennent car vous vous trouverez alors en pleine panique.
Le meilleur moment est lorsque vous n'êtes confronté à aucun problème majeur. Mais à ce stade, vous devrez être capable de convaincre votre direction de la pertinence de vos raisons pour financer un tel projet.
Voici une bonne façon d'y parvenir : demandez à vos dirigeants combien cela que coûterait à l'entreprise si votre site Web avait des temps de réponse affreusement lents aux heures de pointe (au-delà de 30 à 60 secondes par clic).
Et ce qui se passerait si votre site Web s'arrêtait pendant 30 à 60 minutes.
Poser ces questions peut vous aider à convaincre vos dirigeants de la nécessité de mettre en place un cache Web.
Comme nous l'avons déjà mentionné, il existe des solutions gratuites ou des solutions commerciales de mise en cache Web.
Devant la popularité croissance d'ASP.NET parmi les développeurs, des options commerciales de mise en cache Web prenant en charge .NET émergent à présent.
Toutefois, à ce jour, la plupart des produits de mise en cache Web prennent en charge Java et PHP.
La plupart sont des solutions logicielles, mais certaines options matérielles sont aussi disponibles.
Au moment de choisir, pensez d'abord à votre organisation et à son site Web.
À quel point le site est-il dynamique ?
Combien d'utilisateurs avez-vous ?
À quel point la mise en cache va-t-elle vraiment vous aider ?
Considérez ensuite les fonctionnalités de mise en cache dont vous avez besoin.
Comme nous l'avons vu, la mise en cache permet des transactions ultra rapides et évolutives.
Mais elle peut parfois fournir aux utilisateurs des informations périmées.
Gardez cet équilibre à l'esprit en évaluant les diverses solutions.
Iqbal KHAN est le président et développeur technique de Alachisoft.
Alachisoft fournit NWebCache, un cache Web ASP.NET innovant destiné à augmenter les performances et l'évolutivité.
Iqbal est titulaire d'une maîtrise
d'informatique de l'Université d'Indiana, à Bloomington, obtenue en 1990.
Vous pouvez le contacter à l'adresse iqbal@alachisoft.com.