AXOPEN

Infinispan / JBoss – Gestion des caches applicatifs

Infinispan – Cache applicatif

L’utilisation des caches applicatifs en JEE n’est pas une habitude pour les développeurs et les architectes. L’utilisation des caches de types infinispan ou ehCache sont trop souvent limités à la simple fonction de cache hibernate ou JPA.

De nombreuses applications peuvent en effet bénéficier de ces technologies de cache. Il suffit généralement de les penser directement lors de la conception d’une application. Leurs utilisations s’avèrent généralement beaucoup plus simple que ce que l’on pourrait imaginer. Dans cet article nous allons lister un certain nombre de cas, où il est intéressant d’utiliser des caches applicatifs. Ils existent bien sur une infinité de possibilités mais l’objectif est surtout de montrer quelques exemples et de donner des idées quant à leurs utilisations concrètes dans des applications.

Les cas d’utilisations cités ici sont des cas réels ou des caches ont été utilisés avec succès.

Généralités sur les caches

De manière générale, les caches se présentent sous la forme d’une hashmap. Disons d’un ensemble de clé – valeur. La clé permet de retrouver la valeur dans le cache, comme dans une hashmap. La valeur peut prendre n’importe quelle forme, de la simple chaine de caractère à la sérialisation d’un objet complexe. L’utilisation du cache dans une application est la suivante.

  • Vous créez, ou vous vous injectez un cache prêt à l’emploi dans votre application.
  • Vous insérez des valeurs dans ce cache. Généralement on spécifie la durée de vie de l’objet dans le cache, celui-ci peut ainsi supprimer les vielles valeurs quand ceci est nécessaire (On peu également dans certains cas choisir l’algorithme d’élimination d’objet dans le cache).
  • Quand vous cherchez une donnée, vous commencez par chercher dans le cache. Si la donnée s’y trouve vous la récupérez depuis le cache sinon vous allez chercher (ou construire) la donnée et vous la mettez dans le cache pour une utilisation future.

Pour savoir si vous avez besoin d’un cache, vous pouvez vous poser les questions suivantes.

  • La construction de la donnée est-elle un processus long et coûteux (en mémoire, CPU, réseau…) ?
  • La donnée est accédée souvent ?
  • Le cycle de rafraîchissement de la donnée est connu et bien défini ?

Si vous répondez oui à une ou plusieurs de ces questions, votre application gagnerait à utiliser un cache.

Pour résumé l’utilisation des caches en une ligne, le principe est le suivant. Je cherche ma donnée, si elle existe dans le cache, je la prends, sinon je la crée et la stocke dans mon cache.

Implémentations Infinispan dans Jboss

Infinispan est nativement supporté par Jboss, il suffit de quelques configurations pour pouvoir s’injecter un cachemanager dans son application.

Dans le fichier standalone.xml, il suffit de rajouter la configuration suivante pour créer un cache nommé statcache et qui est référence sous le nom JNDI java:jboss/infinispan/stat-cache.


	
		
		
		
	

Utilisation dans une application JEE

Pour s’injecter un cache dans son application, il suffit de d’utiliser une annotation @Resource

 

@Resource(lookup = "java:jboss/infinispan/stat-cache")
protected org.infinispan.manager.CacheContainer mStatContainer;

Puis de l’initialiser 

@PostConstruct
public void onStartup() {
    this.mStatCache = this.mStatContainer.getCache();
}

Et simplement de l’utiliser:

if (mStatCache.get(pStat.getSessionId()) == null) {
   mStatCache.put(pStat.getSessionId(),new ArrayList<StatistiqueNavigation>())
}

Cas d’utilisation des caches

Nous allons ici, décrire un cas d’utilisation des caches applicatifs dans des applications qui sont en production et qui ont vues leurs performances être significativement améliorées par l’utilisation du cache.

Gestion des statistiques des utilisateurs

Bien que des outils puissants de statistiques web existent pour étudier l’utilisation d’un site web ou d’une application, il est souvent nécessaire de créer des statistiques métiers directement dans l’application.

Prenons l’exemple suivant. Vous souhaitez définir quel est le parcours précis d’un utilisateur connecté dans votre application. La première chose à réaliser est de sauvegarder chacun de ces clics dans l’application ainsi que tout un tas de paramètres liés au contexte applicatif. Aucun outil de type Google analytics ne pourra faire ça. Le problème est que si pour chaque action de l’utilisateur dans votre application vous insérer en base des dizaines d’enregistrements, vous risquez vite de pénaliser les performances générales de l’application pour une fonctionnalité non essentielle. Une bonne solution est d’utiliser un cache applicatif.

Le mécanisme est le suivant. Au lieu d’insérer directement en base de données, vous construisez vos objets statistiques et vous allez les mettre dans votre cache. Cette opération est extrêmement rapide car elle s’effectue presque exclusivement en mémoire sans contrôle complexe. De temps en temps, une tâche planifiée vient vider le cache et insérer toutes les statistiques dans la base de données. Ainsi vous maitrisez les performances de votre application.

Il se peut qu’en cas de crash du serveur, vous perdrez les informations de votre cache si celui-ci n’est pas correctement sérialisé sur le disque. Dans le cas présent, ceci n’est pas grave car les statistiques ne sont pas essentielles au bon fonctionnement de l’application.