Projet Spécification des Systèmes Distribués - 2018-19

Concensus en distribué

Le but de ce projet est d'implémenter un algorithme de concensus en distribué en utilisant le framework de communication utilisé en TP.

Fonctionnement général de l'algorithme

L'algorithme fonctionne comme celui vu en cours (transparent 46 du cours "accord et coordination"). A un instant donné, un processus lance l'algorithme en diffusant une requête de déclenchement de l'algorithme en envoyant sa valeur courante (ici un booléen) au passage. Chacun des autres processus ayant reçu cette requête envoie sa valeur courante à tous les autres processus. Une fois qu'un processus a reçu les valeurs de tous les autres processsus, il peut appliquer une fonction identique avec les valeurs de tous les processus et déterminer la valeur commune. Ici, il s'agit simplement de trouver la valeur majoritaire entre les"true" et les "false". En cas d'égalité, on choisira par défaut le "false".

Contraintes techniques

Ajout du service Consensus dans le framework

Rajoutez dans le code du framework un sous-pacakge "consensus" dans le package "service". Créez dans le package service une interface "IConsensus" avec les signatures suivantes :

public interface IConsensus {
   public void register(ConsensusElement elt);
   public void initConsensus(boolean value);
   public void setCurrentValue(Id id, boolean value);
}

La première méthode permet à un processus de dire qu'il veut participer au consensus. La seconde lui sert à lancer l'algorithme en précisant sa valeur. La troisième lui permet de répondre à une requête de demande de valeur et à la diffuser à tous les processus.

N'oubliez pas de modifier la classe "DistributedServicesMiddleware" du framework pour instancier le service de consensus (voir dernier transparent du PDF de description du framework).

Contraintes sur le processus utilisant l'algorithme

Le processus qui veut participer à l'algorithme doit implémenter l'interface "IConsensusElement" qui a les signatures suivantes :

public interface IConsensusElement {
   public boolean askForValue(Id id);
   public boolean resultConsensus(Id id);
}

La première méthode demande au processus sa décision qui sera ensuite renvoyée à tous les autres processus. La seconde méthode informe, lorsque l'algorithme est terminé (on a reçu les valeurs de tout le monde et déterminé la valeur majoritaire), du résultat commun de l'exécution de l'algorithme.

Dans toutes les méthodes "Id" est une classe qui permet d'identifier une occurrence de l'exécution de l'algorithme car plusieurs processus peuvent lancer l'algorithme en parallèle. Cet identifiant peut être formé par l'identifiant du processus initiateur et d'un numéro de séquence.

Contexte

Pour simplifier l'implémentation de l'algorithme, on considèrera :

Evaluation

TODO