J'ai des processus Java (programmes Socket) fonctionnant sur différents serveurs, certains sur le même réseau et d'autres sur des réseaux différents. Ces processus ensemble ont pour tâche de maintenir un compteur global . Un client peut se connecter à l'un de ces processus et émettre une commande à increase
, decrease
ou get
la valeur du compteur. Le compteur global doit être cohérent par la suite (La partition réseau peut apparaître et nous pouvons en récupérer).Compteur distribué de base utilisant des sockets Java
La solution à laquelle j'ai pensé jusqu'ici est de maintenir un compte d'incréments et de décréments sur chaque nœud pour tous les nœuds. Lorsqu'une commande d'incrémentation est émise sur un nœud, elle incrémente sa propre copie locale de ses comptes d'incréments, puis diffuse son compte d'incrémentation et de décrémentation. Les nœuds qui reçoivent cette diffusion prennent le maximum des décomptes reçus et de leur copie locale des décomptes de l'expéditeur et stockent le résultat comme dernier décompte. Lorsqu'une commande get
est émise sur un nœud, elle donne la différence des sommes de tous les incréments et décréments. Je suppose que cela prendra soin des cas où les diffusions sont reçues dans le désordre et d'autres non-fiabilité. Je ne veux utiliser aucune couche de persistance.
Existe-t-il une meilleure façon de l'implémenter? Quel protocole dois-je utiliser pour diffuser les comptes? Est-ce que les potins sur UDP fonctionneront? Toutes les bibliothèques Java qui pourraient aider?
Votre solution intuitive est appelée [CRDT] (http://www.cakesolutions.net/teamblogs/how-to-build-a-distributed-counter) et c'est bien. Un [papier] (https://hal.inria.fr/file/index/docid/555588/filename/techreport.pdf) à ce sujet si vous voulez plus de détails. – Oleg