Prise en Main du Cache sous Windows Azure

This article has been written in an effort by the Windows Azure France team to coordinate the writing of tutorials and how-to guides for various Windows Azure features and technologies. This guide is a direct translation in french of the ‘How to Use Windows Azure Caching‘ guide, available on MSDN

Introduction

« Windows Azure Caching », est une nouvelle fonctionnalité de mémoire cache distribuée disponible pour vos applications Windows Azure.

Elle apporte une amélioration des performances de vos applications Windows Azure, en permettant le stockage en mémoire d’informations provenant de différentes sources de données, telles que des bases de données, par exemple. En stockant en mémoire les informations fréquemment utilisées en provenance d’une base de données, il est possible de réduire le nombre de transactions effectuées, améliorant d’autant la capacité de l’application à pouvoir monter en charge, par exemple.

Le Cache sous Windows Azure supporte l’enregistrement de tout objet .Net persistant (serialisable) et inclut un fournisseur de session et d’enregistrement du rendu des pages ASP.Net préconfigurés, permettant l’accélération des applications web sans modification.

Un modèle de développement unique, que ce soit pour le déploiement d’applications sur Windows Azure ou AppFabric 1.1 for Windows Server, permet d’exploiter la mise en cache.

Avertissement : le Cache sous Windows Azure remplace avantageusement une fonctionnalité similaire, « Windows Azure AppFabric Caching », qui s’appuie sur une infrastructure mutualisée. Celle-ci devient obsolète et il est recommandé de ne plus l’utiliser.

Au contraire, « Windows Azure Caching » introduit un nouveau modèle pour la mise en cache, en utilisant une portion de la mémoire des machines virtuelles sur lesquelles les instances de rôles s’exécutent.

En comparaison, l’utilisation des instances de rôles pour la mise en cache offre les avantages suivants :

  • Des options de déploiement plus souples, sans limites de taille ni quota de restrictions.
  • Pas de coût supplémentaire pour l’utilisation des ressources de mise en cache.
  • Un contrôle et un niveau d’isolation plus fins.
  • Une capacité à suivre la charge de l’application, en adaptant la taille du cache au nombre d’instances s’exécutant pour un rôle. La mémoire disponible pour le cache est effectivement augmentée ou réduite au fur et à mesure que des instances de rôle sont ajoutées ou supprimées.
  • Des performances améliorées.

En outre, une expérience du débogage proche du fonctionnement en production est également proposée, avec un service d’émulation du cache sur le poste de développement.

Ce guide de prise en main offre un aperçu rapide de la fonctionnalité de mise en cache de la mémoire sous Windows Azure. Les fonctionnalités démontrées dans ce guide sont les suivantes :

  • Configuration d’un cache cluster pour mise à disposition d’un cache d’application.
  • Configuration d’un rôle client du cache.
  • Ajout et récupération d’objets dans le cache.
  • Enregistrement du cache des sessions ASP.Net dans le cache Windows Azure.
  • Activation du cache pour le rendu des pages ASP.Net.

Pour une référence plus détaillée du Cache sous Windows Azure, n’hésitez pas à vous reporter à l’un des articles officiels, référencés à la fin de ce guide.

Premiers pas

Comme indiqué, le Cache sous Windows Azure utilise la mémoire des machines virtuelles associées aux instances de rôle pour fournir un espace de mémoire cache. Les instances de rôle qui contribuent à fournir de l’espace au cache forment collectivement le cache cluster.

Le cache cluster doit être configuré au préalable à la mise à disposition aux clients du cache.

Configuration du cache cluster

Le Cache sous Windows Azure peut être déployé selon deux topologies de mise en cache qui se distinguent par l’utilisation ou non de rôles existants :

  • Cache colocalisé : l’utilisation de rôles existants pour la fourniture du cache mutualise les ressources – en particulier, la mémoire vive – utilisées pour l’exécution de vos applications.
  • Cache dédié : la création de rôles dédiés à la fourniture du cache permet l’utilisation de l’intégralité des ressources associées aux machines virtuelles qui forment le cache cluster.

La configuration d’un cache colocalisé se fait en spécifiant un pourcentage d’utilisation de la mémoire disponible pour chaque instance d’un rôle. Pour ce faire, afficher les propriétés d’un rôle existant et sélectionner la rubrique « Cache » d’application :

L’activation du cache sur un rôle existant crée, par défaut, un cache cluster colocalisé qui tire parti de 30% de la mémoire associée à chacune des instances. Un cache par défaut est également configuré automatiquement, mais il est possible de créer d’autres espaces de cache logiques si nécessaire.

Un cache cluster doit maintenir les données de configuration et synchroniser sont état de fonctionnement entre les différentes machines virtuelles qui contribuent au cache. C’est pourquoi il est nécessaire de préciser un compte de stockage Windows Azure valide à cet effet.

Avertissement : si aucun compte de stockage n’est configuré, le rôle ne pourra pas démarrer.

La configuration d’un cache dédié peut se faire via l’ajout d’un projet de rôle « Cache Worker Role » à la solution:

La création d’un rôle dédié au cache créé un rôle sans implémentation particulière et auquel il est recommandé de ne rien ajouter, sous peine d’impacter négativement les performances du cache.

De même que précédemment, ne pas oublier de préciser un compte de stockage Windows Azure valide pour le maintien et la synchronisation de l’état de fonctionnement du cache.

Dans tous les cas, la taille exacte du cache résulte d’une combinaison de facteurs, parmi lesquels :

  • Le caractère colocalisé ou dédié du cache cluster.
  • La taille des machines virtuelles associées au rôle.
  • Le nombre d’instances configurées.

La taille et le nombre d’instances configurées pour l’exécution d’un rôle sont accessibles dans les propriétés de configuration de chacun des rôles :

Pour référence, la taille totale pour la mémoire allouée aux machines virtuelles est listée ci-après. Cette mémoire est partagée entre l’exécution du système d’exploitation, le processus de gestion et les données du cache, ainsi que, dans le cas de la colocalisation, de vos applications. En tout état de cause, la taille disponible pour le cache lui-même peut-être inférieure.

  • Small : 1,75 Go.
  • Medium : 3,5 Go.
  • Large : 7 Go.
  • Extra Large : 14 Go.

À noter que le cache n’est pas supporté sur des machines dont la taille est configurée à Extra Small.

Configuration des rôles clients du cache

Les rôles clients du cache doivent être situés dans le même déploiement que celui dans lequel est configuré le cache cluster.

Dans le cas d’un cache dédié, les rôles clients du cache sont tout simplement les autres rôles hébergés dans le service. Si le cache est colocalisé, il peut s’agir de n’importe quels rôles hébergés dans le service, y compris ceux destinés à l’exécution du service de cache.

La configuration de chaque rôle client du cache peut être effectuée via l’installation d’un package NuGet « Microsoft.WindowsAzure.Caching » qui peut être directement installé à l’aide du gestionnaire de packages dans Visual Studio :

Avec le bouton droit de la souris, cliquer sur le projet de rôle auquel ajouter l’accès au cache, et sélectionner « Manage NuGet Packages… ». Dans la boîte de dialogue qui s’affiche, sélectionner le package « Windows Azure Caching », cliquer sur Install puis sur I accept.

Si le package n’apparaît pas dans la liste, utiliser la zone de texte Search Online (Ctrl+E) pour effectuer une recherche sur « WindowsAzure Caching ».

Le package NuGet effectue les actions suivantes ; il modifie le fichier de configuration du rôle, ajoute un paramètre de niveau de diagnostique pour le client du cache au fichier ServiceConfiguration.csfg associée à l’application Windows Azure, et ajoute les références d’assembly appropriées.

De plus, pour un web rôle ASP.Net, le package NuGet ajoute deux sections au fichier web.config ; la première concerne le paramétrage du cache de session ASP.Net et la seconde active la mise en cache du rendu des pages ASP.Net. Ces deux fonctionnalités sont expliquées plus bas dans ce guide.

Les références d’assembly suivantes sont nécessaires pour l’accès au cache :

  • Microsoft.ApplicationServer.Caching.Client.dll
  • Microsoft.ApplicationServer.Caching.Core.dll
  • Microsoft.WindowsFabric.Common.dll
  • Microsoft.WindowsFabric.Data.Common.dll
  • Microsoft.ApplicationServer.Caching.AzureCommon.dll
  • Microsoft.ApplicationServer.Caching.AzureClientHelper.dll

Dans le cas d’un web rôle ASP.Net, la référence d’assembly suivante est également ajoutée :

  • Microsoft.Web.DistributedCache.dll.

La configuration du rôle est modifiée lors de l’installation du package NuGet. Deux nouveaux éléments, dataCacheClients et cacheDiagnostics, sont ajoutés au fichier web.config ou app.config, dans la section de configuration configSections. S’il n’y avait pas d’élément configSections dans le fichier, il est initialement créé en tant qu’enfant de l’élément configuration.

 <configuration>
 <configSections>
 ...
 <section name="dataCacheClients"
 type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core"
 allowLocation="true" allowDefinition="Everywhere"
 />

 <section name="cacheDiagnostics"
 type="Microsoft.ApplicationServer.Caching.AzureCommon.DiagnosticsConfigurationSection, Microsoft.ApplicationServer.Caching.AzureCommon"
 allowLocation="true" allowDefinition="Everywhere"
 />
 </configSections>

Ces deux sections font référence à deux nouveaux éléments, respectivement, dataCacheClients et cacheDiagnostics, tous deux également ajoutés sous l’élément configuration.

<dataCacheClients>
    <dataCacheClient name="default">
      <autoDiscover isEnabled="true" identifier="[cache cluster role name]" />
      <!--
     <localCache isEnabled="true"
              sync="TimeoutBased"
              objectCount="100000"
              ttlValue="300" />
     -->
    </dataCacheClient>
  </dataCacheClients>
  <cacheDiagnostics>
    <crashDump dumpLevel="Off" dumpStorageQuotaInMB="100" />
  </cacheDiagnostics>

Une fois la configuration ajoutée, modifier l’emplacement réservé [cache cluster role name] par le nom du rôle configuré pour l’exécution du cache cluster.

Avertissement : à défaut, une exception TargetInvocationException sera levée au moment de l’exécution. Sa propriété InnerException renverra un objet DatacacheException avec le message « No such role exists. »

L’installation du package NuGet ajoute également un paramètre ClientDiagnosticLevel à la section ConfigurationSettings associée au rôle client du cache dans le fichier ServiceConfiguration.csfg. À titre d’exemple, voici une section correspondante du fichier ServiceConfiguration.csfg :

  <Role name="WebRole1">
    ...
    <ConfigurationSettings>
    ...
    <Setting name="Microsoft.WindowsAzure.Plugins.Caching.ClientDiagnosticLevel"
             value="1" />
    </ConfigurationSettings>
  </Role>

Le Cache sur Windows Azure est sensible à la fois au niveau de diagnostic du cache cluster et à celui du ou des rôles clients du cache. Le niveau de diagnostic est un paramètre utilisé pour filtrer le niveau d’informations collectées lors de l’exécution du cache. Sa valeur par défaut est 1.

Une fois le rôle client du cache correctement configuré, se reporter aux techniques décrites dans les sections suivantes pour la manipulation du cache.

Manipulation du cache

Instanciation d’un objet DataCache de manipulation du cache

Afin de pouvoir interagir avec le cache, il est nécessaire d’y faire référence, en ajoutant l’espace de nommage suivant parmi le groupe des instructions using situées en haut de chaque fichier source dans lequel il est nécessaire d’accéder au cache.

using Microsoft.ApplicationServer.Caching;

Si Visual Studio ne reconnaît pas l’instruction using, même après avoir installé le package NuGet « Windows Azure Caching » qui ajoute les références d’assembly appropriées, s’assurer que la cible du projet est correctement configurée à .Net Framework 2.0 ou ultérieure, à l’exception des profils affublés de la mention « Client Profile ». Se reporter à la section précédente relative à la configuration des rôles clients du cache pour obtenir des instructions plus précises.

Un premier moyen pour instancier un objet DataCache est tout simplement de créer une nouvelle instance en passant le nom du cache logique en paramètre du constructeur. Il est ensuite possible d’ajouter des objets dans le cache ou de récupérer des objets depuis le cache en suivant les instructions décrites dans la section suivante de ce guide.

DataCache dataCache = new DataCache("default");

Un autre moyen pour instancier un objet DataCache est d’utiliser l’objet DataCacheFactory dans votre application. L’utilisation du constructeur par défaut force l’utilisation des paramètres figurant dans le fichier de configuration.

Appeler, sur l’instance DataCacheFactory, la méthode GetDefaultCache ou bien la méthode GetCache en précisant le nom du cache logique. Ces deux méthodes renvoient un objet DataCache avec lequel il est possible d’utiliser le cache comme indiqué dans la prochaine section.

// cache client configured by settings in configuration file

DataCacheFactory cacheFactory = new DataCacheFactory();
DataCache cache = cacheFactory.GetDefaultCache();

// or select named cache 
//DataCache cache = cacheFactory.GetCache("MyCache");

// cache can now be used to add, retrieve or remove items 

Ajout et récupération d’objets dans le cache

Pour ajouter un élément dans le cache, l’une des méthodes Add ou Put peut être utilisée. La méthode Add ajoute l’objet spécifié en l’associant à une clé, précisée par la valeur du paramètre key. Si un objet possédant la même clé est déjà enregistré dans le cache, une exception de type DataCacheException sera levée au moment de l’exécution, avec le message suivant :

ErrorCode:SubStatus: An attempt is being made to create an object with a Key that already exists in the cache. Caching will only accept unique Key values for objects.

// adds the string "value" to the cache, keyed by "item"
string value = "value";
cache.Add("item", value);

La méthode Put ajoute également un élément dans le cache, en utilisant la clé précisée. Si un objet possédant la même clé est déjà présent dans le cache, il est remplacé par le nouvel élément spécifié lors de l’appel de cette méthode.

// adds or replaces the string keyd by "item" in the cache
string newValue = "newValue";
cache.Put("item", newValue);

Pour récupérer un élément enregistré dans le cache, utiliser la méthode Get. Cette méthode retourne l’objet spécifié s’il existe. Dans le cas contraire, cette méthode retourne null.

string value = String.Empty;

// retrieves an item from the cache, keyed by "item"
object result = cache.Get("item");
if (result == null)
{
    // "item" not in cache. Obtain it from specified data source
    // and add it to the cache for later retrieval
    value = GetItemValue(...);
    cache.Add("item", value);
}
else
{
    // "item" is in cache, cast result to correct type.
    System.Diagnostics.Debug.Assert(result is string);
    value = result as String;
}

Gestion du délai d’expiration des éléments du cache

Par défaut, les éléments placés dans le cache expirent, et sont supprimés du cache, au bout de 10 minutes. Ce délai est précisé par la valeur du paramètre Time to Live (min) associée au cache nommé dans les propriétés du rôle qui héberge le cache cluster.

Il y a trois façons de préciser le délai d’expiration d’un objet dans le cache, en sélectionnant le paramètre Expiration Type associé au cache nommé.

Par défaut, le délai d’expiration est exprimé de manière absolue. Le délai d’expiration d’un élément commence dès qu’il est placé dans le cache. Une fois le délai écoulé, l’élément expire et est supprimé du cache. Cela correspond au réglage Absolute. Placé sur Sliding Window, le délai d’expiration d’un élément est remis à zéro à chaque fois qu’une tentative de récupérer ou mettre à jour cet élément est effectuée dans le cache. L’élément n’expire que si aucun accès n’y est fait pendant toute la durée du délai d’expiration. Enfin, si le paramètre est placé à la valeur None, le délai d’expiration doit avoir pour valeur 0. Les éléments placés dans le cache n’expirent jamais et restent valides tant qu’ils sont dans le cache.

Si un délai d’expiration différent de celui configuré dans les propriétés du rôle est nécessaire, il est possible de préciser une valeur spécifique au moment de l’ajout ou de la mise à jour d’un élément du cache en utilisant les surcharges des méthodes Add et Put qui acceptent un paramètre de type TimeSpan. À titre d’exemple, voici comment préciser un délai de trente minutes :

// adds the string "value" to the cache, keyed by "item"
string value = "value";
cache.Add("item", value, TimeSpan.FromMinutes(30));

Pour obtenir le délai d’expiration d’un élément particulier dans le cache, la méthode GetCacheItem permet d’obtenir un objet DataCacheItem qui contient certaines informations relatives à l’élément placé dans le cache, y compris le temps restant jusqu’à expiration :

// obtain a DataCacheItem containing informations about a cache item.
// if no object keyed "item" exists, then null is returned.
DataCacheItem item = cache.GetCacheItem("item");
if (item != null)
{
    TimeSpan remaining = item.Timeout
    ...
}

Enregistrement du cache de session ASP.Net dans le cache

Le Cache sur Windows Azure inclut un fournisseur ASP.Net pour l’enregistrement de l’état de session dans le cache, plutôt que directement en mémoire ou dans une base de données SQL. Pour utiliser ce fournisseur, s’assurer au préalable d’avoir correctement configuré le cache cluster et le web rôle en tant que client du cache en suivant les étapes décrites plus haut dans ce guide.

L’installation du package NuGet ajoute une section commentée dans le fichier web.config. Cette section contient tout le paramétrage nécessaire à l’utilisation du fournisseur d’enregistrement de l’état de session pour la Cache sur Windows Azure.

    <!-- Windows Azure Caching session state provider -->
    <!--<sessionState mode="Custom" customProvider="AFCacheSessionStateProvider">
      <providers>
        <add name="AFCacheSessionStateProvider"
type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache"
                cacheName="default"
                dataCacheClientName="default"
                applicationName="AFCacheSessionState"/>
      </providers>
    </sessionState>-->

Si le fichier web.config ne contient pas cette section commentée, s’assurer que la version la plus à jour du gestionnaire de packages NuGet est installée. Au besoin, supprimer puis ré-installer le package NuGet « Windows Azure Caching » pour que le fichier web.config soit correctement mis à jour.

Pour activer l’utilisation du fournisseur d’enregistrement de session, supprimer simplement les commentaires autour de la section correspondante dans le fichier web.config. Dans l’exemple ci-dessus, le cache par défaut est utilisé. Pour utiliser un autre cache nommé, préciser simplement son nom dans l’attribut cacheName.

Pour plus d’information sur l’utilisation du fournisseur d’enregistrement de l’état de session ASP.Net, se reporter aux liens officiels qui figurent en ressources à la fin de ce guide.

Activation du cache pour le rendu des pages ASP.Net

Le Cache sur Windows Azure inclut également un fournisseur ASP.Net pour l’enregistrement du rendu des pages web dans le cache. Ce fournisseur est spécifiquement conçu pour l’enregistrement de réponses http complètes – ce qui correspond à des pages entières. Le fournisseur tire parti du nouveau mécanisme d’extension des fournisseurs d’enregistrement du rendu des pages introduit avec ASP.Net 4.

Pour utiliser ce fournisseur, s’assurer au préalable d’avoir correctement configuré le cache cluster et le web rôle en tant que client du cache en suivant les étapes d’installation du package NuGet décrites plus haut dans ce guide.

L’installation du package NuGet « Windows Azure Caching » ajoute une section commentée dans le fichier web.config. Cette section contient tout le paramétrage nécessaire à l’utilisation du fournisseur d’enregistrement du rendu des pages en cache dans Windows Azure.

    <!-- Windows Azure Caching output caching provider -->
    <!--<caching>
      <outputCache defaultProvider="AFCacheOutputCacheProvider">
        <providers>
          <add name="AFCacheOutputCacheProvider"
type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache"
                cacheName="default"
                dataCacheClientName="default"
                applicationName="AFCacheOutputCache" />
        </providers>
      </outputCache>
    </caching>-->

Si le fichier web.config ne contient pas cette section commentée, s’assurer que la version la plus à jour du gestionnaire de packages NuGet est installée. Au besoin, supprimer puis ré-installer le package NuGet « Windows Azure Caching » pour que le fichier web.config soit correctement mis à jour.

Pour activer l’enregistrement du rendu des pages ASP.Net en cache, supprimer simplement les commentaires autour de la section correspondante dans le fichier web.config. Dans l’exemple ci-dessus, le cache par défaut est utilisé. Pour utiliser un autre cache nommé, préciser simplement son nom dans l’attribut cacheName.

Ajouter ensuite une directive OutputCache en en-tête de chacune des pages qui doivent être mises en cache.

<%@ OutputCache Duration="60" VaryByParam="*" %>

Dans cet exemple, les données de page mises en cache le seront pendant 60 secondes. Une version différente de la page sera également mise en cache pour chaque combinaison de paramètres.

Pour plus d’information sur l’utilisation du fournisseur d’enregistrement de l’état de session ASP.Net, se reporter aux liens officiels qui figurent en ressources à la fin de ce guide.

Autres ressources

Ce guide a été écrit dans le cadre d’un travail mené par l’équipe Windows Azure France pour mettre en œuvre la création ou le relais de tutoriaux pour la communauté francophone. Il est directement inspiré du tutorial officiel, situé à l’emplacement suivant :

[1] How to Use Windows Azure Caching
http://www.windowsazure.com/en-us/develop/net/how-to-guides/cache/

Les ressources suivantes ont également été utilisées, en partie, pour la rédaction de ce guide de prise en main :

[2] Overview of Windows Azure Caching

[3] Windows Azure Caching FAQ

[4] Capacity Planning Considerations for Windows Azure Caching

[5] Session State Provider for Windows Azure Caching

[6] Output Cache Provider for Windows Azure Caching

About these ads
This entry was posted in Windows Azure and tagged , , . Bookmark the permalink.

One Response to Prise en Main du Cache sous Windows Azure

  1. Pingback: [Tutoriel Windows Azure] Prise en Main du Cache sous Windows Azure - Windows Azure France - Site Home - MSDN Blogs

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s