# Terracotta Cluster

Terracotta Cluster est une solution qui permet de clusteriser des machines virtuelles Java (JVM). Ainsi, l'exécution d'une application Java - multi-threadée ou non - peut être répartie sur différents serveurs. Terracotta manipule le bytecode Java au chargement du code dans la JVM, ce qui permet de conserver les spécificités de Java au travers des clusters, telles que le passage par référence, la coordination de threads, et le ramasse-miette. Un simple fichier XML rend possible la mise en cluster des JVMs, les objets n'ont alors plus besoin d'être sérialisés.
Cas typiques d'utilisation :
* Cluster de session HTTP
* Mise en cache distribuée
* Mise en cache d'Hibernate
* Répartition de charge de travail
* Coordination d'inter-JVM
* Cluster de POJO

## Historique de Terracotta

Jusqu'aux années 1990, les applications d'entreprise n'étaient pas destinées à être clusterisées, et étaient principalement liées à des bases de données relationnelles. Les applications, en grandissant, ont eu besoin de plus en plus de ressources. Pour pallier ce problème, la première solution a été la réduction au maximum du couplage entre les différentes couches de l'application, dans la mesure où un service peut être hébergé sur un serveur différent, sans pour autant compliquer le modèle de programmation.
Quand cette solution a montré ses limites, des réajustements ont dû être opérés ; c'est là que la clusterisation intervient. Les développeurs ont toujours vécu avec le regroupement et l'évolutivité étroitement couplés à la logique métier. Ce couplage étroit était une contrainte qui suivait les développeurs de la conception jusqu’au déploiement de l'application. Plus précisément, les développeurs et architectes devaient sélectionner JDBC, JMS ou des technologies similaires, pour la sérialisation et le déplacement de données entre les processus.

## Principe de fonctionnement

Aujourd'hui, Terracotta Cluster permet aux développeurs de s'abstraire de cette architecture répartie, et de se concentrer uniquement sur le code applicatif. De plus, il permet que la propagation d'une application à travers les JVMs soit une décision à l’exécution, et évite ainsi aux développeurs de coder en dur les techniques de « clusterisation ».
Le système de Terracotta augmente le bytecode JAVA au chargement dans la JVM, afin d’observer les changements des objets et de coordonner les verrous et les modifications des objets au travers des JVMs.
Le kit Terracotta se divise en deux parties :
* Serveur Terracotta : Les serveurs Terracotta coordonnent les clients qui s'y connectent. Plusieurs serveurs peuvent être définis, l’un d’entre eux étant le serveur principal. S’il y a plusieurs serveurs, les clients essaieront de se connecter à ces serveurs dans l’ordre jusqu'à ce qu’un serveur actif soit atteint. Si un serveur actif tombe en panne ou devient inaccessible, les clients tenteront de se connecter à un autre serveur, jusqu’à ce qu’ils réussissent (voir la vidéo).
* Client Terracotta: Ce sont les serveurs (machines) qui hébergent l'application Java clusterisée qui se connectent au serveur Terracotta. Ces applications peuvent être de simples applications Java (voir vidéos), ou des applications Web.
La particularité de Terracotta est que la clusterisation se fait sous la couche JVM, ce qui permet l'abstraction de la clusterisation aux développeurs d'applications Java.

## Licence

Terracotta est développé et maintenu à la fois par la société Terracotta et par des bénévoles. Les utilisateurs ont accès au code source et aux fichiers binaires de Terracotta sous couvert de la Terracotta Public License (TPL), qui est basée sur la Mozilla Public License (MPL). Cependant, la TPL rajoute une clause de publicité similaire à celle de la version originale de la licence BSD, ce qui pose des problèmes pratiques lors de l'utilisation de logiciels couverts par cette licence.
Certaines fonctionnalités spécifiques en cours de préparation ne seront pas sous licence TPL, et seront donc uniquement maintenues par la société Terracotta.