1

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?

+1

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

Répondre

0

Vous pouvez être au courant de ce modèle de conception, mais il peut encore être source d'inspiration: https://en.wikipedia.org/wiki/Observer_pattern

Vous pouvez tout simplement faire toutes les instances du programme à respecter impérativement toutes les autres cas, ils seront tous en informer l'un l'autre si l'un d'eux change (consultez le diagramme dans ce lien).

En ce qui concerne une bibliothèque Java, vérifier ces, voir si l'un d'eux vous rendre la vie plus facile:

+0

Si tous mes processus Java sont des sujets et qu'ils sont tous des observateurs, le sujet notifiera chaque fois qu'un incrément ou une décrémentation se produira (ce qui arrivera assez souvent), à mesure que le nombre de nœuds augmente, le réseau sera bloqué en raison des processus qui se parlent tout le temps. – azuri

0

Cela ressemble à vous avez besoin d'un PNCounter de la bibliothèque de données distribuée d'Akka. Il utilise Gossip pour communiquer l'état du compteur au réseau. Vous avez également un bon contrôle de la cohérence en lecture et en écriture. Ainsi, par exemple, vous pouvez faire un ReadMajority où "la valeur sera lue et fusionnée à partir d'une majorité de répliques". Par ailleurs, le PNCounter fonctionne comme vous le décrivez, en utilisant deux compteurs distribués pour maintenir les incréments et les décréments.