DataGrid Infinispan : Coherence Open Source ?

***Infinispan ***(http://www.jboss.org/infinispan/) se définit lui même comme “peer-to-peer, in-memory data grid platform” et existe depuis Avril 2009.
***Infinispan ***est une évolution de JBoss Cache, ce n’est pas simplement un renommage de projet mais une vraie évolution vers les Grid.
Il est écrit en Java (comme Coherence) et est compatible avec Java SE 6 (ainsi que la plupart des JVM des éditeurs alternatifs).
Licence : Open source, LGPL.

Dans presque toutes les applications d’entreprise, la base de données est la première cause du manque de performance mais aussi du manque de scalabilité.
Les frameworks ORM facilitent la mise en œuvre d’un SGBD dans une application mais en contrepartie éloignent les développeurs des problématiques des bases de données. La maîtrise des bases de données devrait passer par un DBA.
De plus la scalabilité d’un SGBD et loin d’être évidente à maitriser (avec parfois un impact sur les développements), et un cluster de base de données diffère d’un cluster de serveur d’application (typologie failover ou partitionnement des données plutôt que réplication des données).

Ainsi sont apparus les caches distribués et capables de répartir les données et les appels sur plusieurs machines reliées entre elles.
En effet outre la rapidité, la disponibilité est grande grâce à la redondance. Et même en cas de crash la remise en état est plus rapide qu’avec un SGBD.

La base de données, lorsqu’elle est encore présente, sert à l’archivage des données (qui on le verra peut être fait dans des fichiers).

Toutefois le SGBD est encore indispensable dans les cas suivant :

  1. Grosses volumétries (au delà de la limitation mémoire des JVM et de l’OS).
  2. Besoin de tout l’historique des transactions.

Parmi les offres commerciales il y a ***Oracle Coherence ***(http://www.oracle.com/technology/products/coherence/index.html).
***Coherence ***a beaucoup de qualités (notamment une rapidité de prise en main bluffante) mais aussi un gros défaut : il est payant !
C’est pourquoi nous étudions une alternative open source : Infinispan.

Classiquement les données sont stockées dans un objet de type Map (JSR-107 JCACHE) :

  • Clé : identifiant unique de la valeur dans le cache.
  • Valeur : classe Java.

La classe Java doit être sérialisée pour réduire la taille du stockage et favoriser les échanges :

  • Sérialisation java classique – ***Coherence ***uniquement (Serializable, Externalizable).
  • Sérialisation maison – JBoss Marshalling (Infinispan), POF/ExternalizableLite (Coherence).
  • Aucune sérialisation à condition de respecter certaines conditions (cache local, pas de SGBD, etc.) – ***Infinispan ***uniquement.

Ce qui fait la force des DataGrid c’est la simplicité de la gestion de la scalabilité :

  1. Découverte automatique des nœuds sur le réseau (on démarre simplement un nouveau nœud avec une configuration identique).
  2. Synchronisation et répartition automatique des données sur chacun des nœuds afin d’assurer une haute disponibilité.
  3. Répartition intelligente des données (Cache local) permettant de stocker les données au plus prêt de leur utilisation et évitant les accès réseau.
  4. En cas de crash d’un nœud les données qu’il contenait sont automatiquement réparties sur les nœuds restant.
  5. La répartition des données est transparente pour le client (on accède à toutes les données à partir de n’importe lequel des nœuds).

Un système de lock permet de réserver une donnée pour modification :
***Infinispan ***supporte la méthode MVCC pour la gestion des accès concurrents (comme Oracle, SQL Server, etc.).
Les niveaux d’isolation supportés sont  : READ_COMMITTED et REPEATABLE_READ.

***Infinispan ***utilise ***JGroups ***pour la gestion du cluster, la découverte de nouvelle instance ainsi que la communication entre les caches.

***Infinispan ***et ***Coherence ***supportent les transactions distribuées (JTA).

Politique d’expiration des données

On défini la durée de vie de la donnée au moment de son insertion (temps max et temps minimum entre deux utilisations de la données).

Lorsqu’il vient à manquer de place, le cache purge les données selon des procédés classiques :

  • FIFO.
  • LRU (données les moins utilisées).

Tout comme Coherence, ***Infinispan ***est compatible avec la norme JMX pour la collecte des statistiques et le monitoring. Une simple ***JConsole ***permet donc de superviser le cache.

***Maven ***est supporté par les deux projets (repository accessible à partir du POM projet).

Il n’y a pas une seule et unique topologie de DataGrid car cela dépend des besoins.
Cela peut aller d’un unique cache déployé sur un seul serveur à plusieurs centaines de nœuds abritant chacun plusieurs caches.
De même un cache est associé ou non à une source de données (SGBD).

Voici les principales topologies :

Cache répliqué

Infinispan-Replication

Chacun des nœuds du cache abrite l’ensemble des données (redondance totale).
Dans ce cas la base de données n’est pas nécessaire.

Cohabitation avec un SGBD

Infinispan-SGBD

Le cache et le SGBD contiennent les même données. Le cache favorise les temps d’accès en lecture, évite les contentions de la base de données et permet même d’accélerer les temps d’écriture en configuration ‘Write Behind’.

Cache réparti

Infinispan-Cache réparti

C’est lorsqu’il est déployé sur plusieurs serveurs avec redondance des données et sans SGBD que le DataGrid est le plus intéressant et le plus innovant en terme d’architecture. En cas de crash d’un nœud les données qu’il contenait sont automatiquement réparties entre les nœuds restant.

L’application et le cache est installée sur les mêmes serveurs afin de faciliter les accès aux données (évite les accès distant et les échanges réseaux inutiles).

Des traitements alimentent le cache régulièrement ou bien à l’initialisation si les données ne changent pas.

Client distant

Infinispan-Rest

Les accès distants se font via REST pour tous les clients (JVM ou pas), il faut donc un serveur Web.
Il est même possible d’utiliser la nouvelle norme WebSocket (COMET façon HTML5) et dans ce cas un serveur est fourni avec la livraison Infinispan.

Dès lors pratiquement tous les langages sont supportés : Java, .net, Ruby, PHP, etc.

Traitements distribués

***Infinispan ***propose une API de type ***MapReduce ***permettant de soumettre un traitement à réaliser et un ensemble de clés d’objets sur lesquels doivent s’appliquer le traitement.
***Coherence ***propose la même fonctionnalité de distribution des traitements à chacun des caches (chaque cache opère le traitement sur les données qu’il possède en local).

Tout comme Coherence, ***Infinispan ***peut être utilisé comme cache de niveau 2 ***Hibernate ***(L2).

Mises à jour en continue

Possibilité d’effectuer des requêtes continues afin que le résultat d’une requête continue de s’enrichir au fur et a mesure de l’arrivée de données dans le cache.
La connexion entre le cache et le client est maintenue et le client est averti lors de la modification ou l’arrivée de nouvelles données.

Différences majeures avec Coherence

Accès distant et multi langages

***Coherence ***propose des clients spécifiques pour les langages autres que Java (C++, dot net).

Alors que pour pouvoir utiliser l’accès distant avec ***Infinispan ***(API REST), il faut un serveur Java EE (ou du moins un serveur compatible REST). Si le service est le même et les possibilités d’interopérabilité plus grande, les performances ne sont pas comparables.

Sérialisation et redondance

***Infinispan ***laisse la possibilité au développeur de choisir l’implémentation XML (XStream est possible).
Pour assurer l’interopérabilité, ***Coherence ***utilise POF (Portable Object Format) et fourni un client de sérialisation\désérialisation pour chacun des langages ciblés.

***Infinispan ***permet de gèrer plus finement la copie de données contenues dans les autres caches (en mémoire, ou dans des fichiers).
Il est même possible de définir le nombre de copies stockées dans le cache. ***Coherence ***ne donne pas la main sur ce paramétrage et ne propose qu’un seul backup. Ainsi dans le cas peu probable ou deux nœuds crasheraient en même temps des données pourraient être perdues.
***Infinispan **est donc plus sécurisé mais au prix d’une complexification du paramétrage.

***Addendum **: suite à un commentaire, il apparait que ***Coherence ***propose lui aussi cette option.

API requetage

***Infinispan ***ne proposera une API définitive que dans la version 4.1 (actuellement en béta), les fonctionnalités présentes dans la version béta sont assez similaires mais susceptibles d’évoluer. Coherence propose son propre langage de requête proche de HQL ou JPAQL.

Indexes

***Infinispan ***ne propose pas encore d’index sur les critères les plus fréquemment utilisé contrairement à ***Coherence ***mais cette fonctionnalité sera probablement intégrée dans une future version.

Recherche de données dans le cache

Utilisation de ***Lucene ***pour offrir une API de requêtes puissante permettant des recherches dans le DataGrid.
Intégration éventuelle avec Hibernate Search.
Infinispan se substituerait à ***Hibernate Core ***(en tant qu’entrepôt de données), ***Hibernate Search ***lui apporterait alors la fonctionnalité de recherche.

Hiérarchisation des caches

***Infinispan ***propose aussi une structure arborescente pour le stockage des données (TreeCache), tout comme ***JBoss Cache ***(imaginez une grappe d’objets liés, chaque niveau représentant un cache).

Passivation

Intervient quand une données est supprimée de la mémoire elle est alors stockée dans le cache store (fichier, SGBD, etc.) et donc toujours accessible (en lecture uniquement). On peut voir cela comme un archivage des données.

Supervision

***Infinispan ***est compatible avec ***JOPR ***( www.jboss.org/jopr) qui est la solution de supervision de l’ensemble des produits JBoss Middleware.
L’outil assure non seulement la supervision des caches mais aussi certaines taches de maintenance.

Hormis la compatibilité JMX, ***Coherence ***s’appuie plutôt sur des éditeurs tiers pour le monitoring des caches.

Serveur Memcached

Particularité d’Infinispan (à partir de la version 4.1) il propose sa propre implémentation du protocole Memcached.
Ainsi tous les clients existant de ***Memcached ***restent compatibles mais profitent des possibilités de réplication de données d’Infinispan.
***Infinispan ***propose ainsi une implémentation ***Memcached ***en Java a laquelle s’ajoutent des fonctionnalités de clustering et de failover.

Coherence Web

Coherence Web permet de partager les sessions http entre différents serveur Java EE ou Web.
Il permet donc de mettre en place un cluster de serveur java sans utiliser de cluster système ou au niveau du serveur d’application et ce même avec des serveurs d’éditeurs différents (WebLogic, WebSphere, Tomcat, etc.).