Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Premier contact avec Windows Server AppFabric partie II

Poster un commentaire

Dans la première partie, nous avons fait une présentation rapide de Windows Server AppFabric et procédé à son installation dans un cluster.

Il ne reste plus qu’à faire des essais. Cet article est consacré au service de cache, l’article suivant explorera l’hébergement de services WCF.

 

On peut si on le souhaite télécharger un exemple ici:

http://www.microsoft.com/en-us/download/details.aspx?id=19603

 

Nous allons faire les choses à la main afin de bien décrire les points importants. Pour rappel:

Le cluster est constitué de deux serveurs appelés:

  • AmethCluster1
  • AmethCluster2

L’installation par défaut a été choisie. Le port du service de cache est donc: 22233

Administration du cache

AppFabric est livré sans outils d’administration du cache. Nous n’avons que l’interface PowerShell.

On peut toutefois trouver ce projet sur CodePlex:

http://mdcadmintool.codeplex.com/

J’ignore ce qu’il vaut faute d’avoir pu le lancer. La version pour AppFabric 1.1 est en béta depuis 2012…

Configuration IIS

Ce chapitre ne vous concerne que si votre application est hébergée dans IIS.

 

Vous allez vous simplifier la vie en lançant votre projet depuis IIS.

2014-07-17_14-53-30

Ensuite créez un pool d’application spécifique pour le site et qui s’exécute sous l’identité amethysteAppFabric. Vérifiez également que côté cluster ce compte soit autorisé. En principe l’assistant d’installation s’en est chargé.

2014-07-17_14-56-15

 

Premiers essais

Normalement on devrait utiliser le package Nuget. J’ai eu des problèmes parce que si les dll côté client n’ont pas la même version que celles côté serveur, rien ne marche et pas eu moyen de trouver comment mettre à jour le côté serveur.

Le plus simple est donc de récupérer sur le serveur les dll suivantes installées dans le GAC et de créer une référence projet:

2014-07-12_17-55-41

 

Notre premier essai exploitera le cache par défaut qui est toujours présent:


string msg;
var factory = new DataCacheFactory();
var cache = factory.GetDefaultCache();

cache.Add("Message1", "Salut tout le monde");
msg = (string)cache.Get("Message1"); // Salut tout le monde
cache.Put("Message2", "Chef, j'ai glissé");
msg = (string)cache.Get("Message2"); // Chef, j'ai glissé
cache.Put("Message1", "Helloooooooo");
msg = (string)cache.Get("Message1"); // Helloooooooo

Les méthodes de base sont Put, Add et Get. Put et Add sont similaires, mais Add lève une exception si on l’applique à une clef déjà existante. Notez également que les clefs sont sensibles à la casse.

On peut appliquer un délai d’expiration à un élément du cache:

cache.Put("Message", "Début", TimeSpan.FromSeconds(5));
msg = (string)cache.Get("Message"); // Début
Thread.Sleep(5010);
msg = (string)cache.Get("Message"); // Null

 

Il est possible de segmenter le cache en régions. Celle-ci doivent être crées avant de pouvoir être utilisées:

cache.CreateRegion("RegionA");
cache.CreateRegion("RegionB");
cache.Put("Message", "Message 1");
cache.Put("Message", "Message 2", "RegionA");
cache.Put("Message", "Message 3", "RegionB");

msg = (string)cache.Get("Message"); // Message 1
msg = (string)cache.Get("Message", "RegionA"); // Message 2
msg = (string)cache.Get("Message", "RegionB"); // Message 3

Si on lance la commande Get-Region on trouve:

Tandis que Get-Cache:

Le cache local

Pour activer le cache local il suffit d’ajouter cette ligne dans le fichier de configuration, à l’intérieur de la section <dataCacheClient>:

<localCache isEnabled="true" sync="TimeoutBased" objectCount="10000" ttlValue="300" />

Et de mettre à true l’attribut isEnabled.

L’attribue sync attend au choix:

  • TimeoutBased
    On utilise un délai d’expiration pour invalider le cache local.
  • NotificationBased
    On invalide le cache via des notifications. Il faudra pour cela activer la notification lors de la configuration du cache, ce que nous n’avons pas fait.

L’attribut ttlValue définie la durée en seconde durant lequel les objets seront gardés dans le cache.

http://msdn.microsoft.com/fr-fr/library/ee790880(v=azure.10).aspx

Au niveau du code rien de très différent.

Comment tester?

 

On vide le cache dans un premier temps:

restart-cachecluster

get-cachestatistics default

Il s’affiche ceci qui montre que le cache a bien été vidé:

2014-07-20_22-59-48

On lance le code suivant:

var factory = new DataCacheFactory();
var cache = factory.GetDefaultCache();
// get-cachestatistics default => RequestCount = 1
cache.Add("Message", "Message 1");
// get-cachestatistics default => RequestCount = 2
msg = (string)cache.Get("Message"); // Message 1
// get-cachestatistics default => RequestCount = 2

La commande get-cachestatistics default remonte successivement:

2014-07-20_23-02-44

Puis:

2014-07-20_23-04-34

On voit que le RequestCount est bien resté à 2 après le Add. C’est parce que le cache est local et qu’il n’a pas besoin  d’accéder au service. En l’absence de cache local on aurait lu 3.

 Mettre la session en cache

Nous allons modifier la section <sessionState> de <system.web> pour lui indiquer d’utiliser appFabric comme provider plutôt que le provider par défaut:

<sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider">
<providers>
    <add
        name="AppFabricCacheSessionStoreProvider"
        type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider"
        cacheName="AmethysteCache"
        sharedId="123456"/>
</providers>
</sessionState>

Depuis la console PowerShell vous devrez créer le cache:

New-Cache AmethysteCache

La commande Get-Cache montre:

2014-07-20_23-06-13

Et si vous ouvrez le fichier de configuration, la section <caches> est complétée par:

<cache consistency="StrongConsistency" name="AmethysteCache"
    minSecondaries="0">
    <policy>
        <eviction type="Lru" />
        <expiration defaultTTL="10" isExpirable="true" />
    </policy>
</cache>

Le point intéressant est que l’architecture des sessions est mieux ficelée que celle du cache. On peut fournir à volonté un nouveau provider et on a rien à modifier dans le code.

 

On peut suivre l’écriture dans le cache avec la commande bien connue:

get-CachesStatistics AmethysteCache

On surveille par exemple ItemCount.

Notez que le fournisseur AppFabric ne déclenche pas l’événement Session_End.

La haute disponibilité

Elle n’est pas active par défaut. Pour l’activer on doit lancer:

set-CacheConfig –cacheName NOM-CACHE –Secondaries 1

Si le cache existe déjà:

  • Arrêter le cluster : stop-cache cluster
  • Configurer : set-CacheConfig –cacheName NOM-CACHE –Secondaries 1
  • Lancer le cluster : start-cachecluster

Il est important de faire attention. La haute dispo ne marche qu’avec les versions Enterprise ou Datacenter de Windows.

J’ai tenté le coup avec des versions antérieures, la commande plante. Le plus gênant est qu’elle casse le cluster et il faut le reconstruire. Il y a des choses qui fonctionnent en apparence, mais pas tout comme la création de régions.

Si vous souhaitez en savoir plus sur la haute dispo:

http://msdn.microsoft.com/fr-fr/library/hh351441(v=azure.10).aspx

 

Bibliographie

  1. http://blog.infine.com/prise-en-main-du-cache-distribue-microsoft-appfabric-2040
  2. http://vivekcek.wordpress.com/category/windows-server-appfabric-caching/
  3. http://www.docstoc.com/docs/106898405/Introduction-To-AppFabric-Cache
  4. http://download.microsoft.com/download/3/1/C/31CED722-2E5F-48D6-96B1-E73AAFD9873F/AppFabricWebFarm.docx
  5. http://blogs.msdn.com/b/appfabriccat/archive/2010/11/30/basics-on-how-to-setup-an-app-fabric-cache-server-and-api-usage.aspx
  6. http://www.wadewegner.com/2010/08/configuring-an-asp-net-web-application-to-use-a-windows-server-appfabric-cache-for-session-state/

 

 

 

 

 

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s