# JGroups

JGroups est un système fiable (c'est-à-dire qui ne perd pas les messages) de multicast écrit dans le langage Java.

## Multicast

Nous disposons de plusieurs moyens pour communiquer avec une ou un groupe de machines :
* Unicast : Dans ce système, chaque message a un destinataire. Donc, pour envoyer le même message à plusieurs personnes, il faut le dupliquer pour chaque destinataire.
* Multicast : Dans ce système, chaque machine qui désire recevoir les messages vers un groupe donné s'enregistre sur une adresse (l'adresse de groupe). Pour envoyer, il suffit donc d'envoyer à l'adresse du groupe, une et une seule fois.
* Broadcast : Dans ce système, chaque message est envoyé à chaque machine qui se trouve sur le réseau. Donc, les machines doivent elles-mêmes filtrer les messages non désirés.
TCP/IP propose un système de multicast et JGroups a été initialement créé pour pouvoir automatiser le processus d'abonnement, réception et désabonnement d'un multicast IP. JGroups supporte ainsi les fonctionnalités suivantes :
* Création et destruction de groupes multicast. Ces groupes peuvent être sur un réseau local ou un réseau de grande taille.
* Abonnement et désabonnement de ces groupes.
* Transmission de messages (non fiables) entre groupe.

## Extensions fournies par JGroups

Le multicast IP est utilisé dans diverses applications:
* Diffusion en temps réel de flux audio ou vidéo: dans ce cas, si un paquet est perdu ou arrive dans un mauvais ordre la perte n'est pas très importante, les paquets précédents et suivants sont probablement suffisants pour récupérer.
* Le protocole OSPF, pour la détection automatique de routeurs: dans ce cas, la perte des paquets n'est pas un problème car très peu probable.
Ces applications ne nécessitant pas un contrôle de flux, le multicast IP utilise un protocole non fiable et n'ayant aucun contrôle d'ordonnancement. JGroups a rapidement été étendu pour pouvoir pallier ces manques et offre plus de fonctionnalités et de flexibilité:
* Un choix parmi divers protocoles de transport: UDP, TCP ou encore JMS.
* Détection d'abonnement et notifications au sujet des membres qui ont rejoint ou quitté le groupe.
* Détection et enlèvement de membres s'étant "plantés" (terminaison inattendue).
* Transmission fiable et ordonnée des messages.
* Messages point-à-point.
* Fragmentation des messages trop grands.
* Politiques d'ordonnancement: atomique (tout ou rien), FIFO, ordre total.
* Encryption.
* etc.
JGroups est donc un système simple, rapide et fiable permettant de mettre en communication un ensemble de machines et proposer des services tels que la synchronisation, la répartition de charge ou encore la substitution (failover) en cas de problème.

## Usages

JGroups est utilisé dans de diverses applications:
* JBoss et JOnAS utilisent tous les deux JGroups pour gérer les parties répartities du serveur et la répartition des caches
* GroupPac (une implémentation de la spécification CORBA tolérante aux fautes) utilise JGroups
* Autodesk LocationLogic utilise JGroups dans son mécanisme de réplication de cache
* Apache ActiveMQ Artemis utilise JGroup pour son mécanisme de répartition
* etc.

## Ressources

* (en) Le site web JGroups
* (en) Un petit exemple de distributeur de requêtes utilisant JGroups
* (fr) Une présentation de JGroups
* (fr) Un rapport présentant JGroups