Une application

Je vous propose de mettre en place une architecture de diffusion d'information. Elle est programmée de manière hiérarchique pour que l'implémentation soit facile et évolutive (mais lente).

     client
        |
        |
        V
 serveur [CACHE] (numéro RPC = 1234563)
        |
        |
        V
 serveur [FIABLE] (numéro RPC = 1234562)
        |
        |
        V
serveur [REPARTI]  (numéro RPC = 1234561)
        |
        |
        V
serveur [STOCKAGE]  (numéro RPC = 1234560)

Mettez bien une trace dans vos différents serveurs pour voir ce qu'ils font.

Le client fonctionne de la même manière (même protocole) quelque soit le serveur auxquel il s'adresse. Il n'a pas à connaître le type du serveur.

Structure de donnée

Voici la structure de stockage (variable locale au fichier) qui vous demandera le moins de travail (elle est très peu performante car la recherche parcours tous les éléments du tableau).
#define TAILLE_NOM               8 /* Longueur du nom de variable          */
#define TAILLE_VALEUR        10000 /* Taille d'une valeur                  */
#define MAXIMUM_DE_VARIABLES   100 /* Nombre maximum de variables          */
struct variable
   {
   char nom[TAILLE_NOM] ;          /* Nom variable ("" si libre)           */
   char valeur[TAILLE_VALEUR] ;    /* Valeur de la variable                */
   int  version ;                  /* Nombre de modifications de la valeur */
   } variables[MAXIMUM_DE_VARIABLES] ;

Stockage de l'information

But

Chaque serveur [STOCKAGE] contient un ensemble de paire nom de variable, valeur de variable qu'il est chargé de mémoriser

Arguments

Au lancement, il n'y a aucun argument à donner.

Fonctions offertes

Test

Ecrire un client RPC, celui-ci aura comme paramètres : Tester bien votre serveur avant de continuer :
client MachineA 1234560 STOCKE   toto 10
client MachineA 1234560 STOCKE   titi 11
client MachineA 1234560 STOCKE   tata 12
client MachineA 1234560 RECUPERE tata      # Affiche 12
client MachineA 1234560 RECUPERE titi      # Affiche 11
client MachineA 1234560 RECUPERE toto      # Affiche 10
client MachineA 1234560 DETRUIRE titi
client MachineA 1234560 RECUPERE tata      # Affiche 12
client MachineA 1234560 RECUPERE toto      # Affiche 10
client MachineA 1234560 STOCKE   tata 167
client MachineA 1234560 RECUPERE tata      # Affiche 167
client MachineA 1234560 RECUPERE toto      # Affiche 10
# Tuez le serveur [STOCKAGE] (avec ^C ou un kill)
client MachineA 1234560 RECUPERE toto      # Sort une erreur

Stockage réparti

But

Chaque serveur [STOCKAGE] stocke une quantité limité d'information. Pour en stocker plus, il faut répartir l'information sur plusieur serveurs [STOCKAGE].

Le serveur [REPARTI] dirigera la fonction que l'on veut exécuter vers le bon serveur [STOCKAGE]

Arguments

Les noms des machines sur lesquelles tourne un serveur [STOCKAGE] et entre lesquelles il faut répartir le stockage.

Fonctions offertes

Le serveur [REPARTI] offre les mêmes fonctions que le serveur [STOCKAGE]. Lorsqu'on lui demande d'exécuter une fonction, il appelle l'un des serveurs [STOCKAGE] pour exécuter la fonction en question.

Il choisit le serveur sur lequel il exécute la fonction avec la formule suivante : (somme des caractères du nom de la variable) modulo (le nombre de serveurs)

Attention, a capacité de stockage du serveur répartie est presque celle de la somme des serveurs de stockage.

Test

Fiabilité

But

Faire en sorte que tout fonctionne même si un serveur [STOCKAGE] s'arrête.

Ce serveur stocke la données plusieurs fois afin de résister aux pannes des serveurs [STOCKAGE]. Voici comment les fonctions fiables vont réagir:

ON NE DOIT LANCER QU'UN SEUL SERVEUR [FIABLE] SINON IL Y AURA DES INCOHERENCES.

Arguments

Le nom d'un serveur [REPARTI] (ou plus si vous programmez vite)

Fonctions offertes

Ecrire un serveur [FIABLE] qui a les même fonctions que le serveur [STOCKAGE], à la différence près que le nom est limité à (TAILLE_NOM-1) caractères.

Attention, a capacité de stockage du serveur fiable est égale à celle du serveur réparti.

Test

Pour vérifier votre programme, lancer : Puis exécutez :
client MachineF 1234562 STOCKE   toto 10
client MachineF 1234562 STOCKE   titi 11
client MachineF 1234562 STOCKE   tata 12
# tuer le serveur [STOCKAGE] de Machine1
client MachineF 1234562 RECUPERE toto  # Affiche 10
client MachineF 1234562 RECUPERE titi  # Affiche 11
client MachineF 1234562 RECUPERE tata  # Affiche 12
# tuer le serveur [STOCKAGE] de Machine2
client MachineF 1234562 RECUPERE toto  # Affiche 10
client MachineF 1234562 RECUPERE titi  # Affiche 11
client MachineF 1234562 RECUPERE tata  # Affiche 12
# Relancer le serveur [STOCKAGE] sur Machine1
client MachineF 1234562 STOCKE   toto 110
client MachineF 1234562 STOCKE   titi 111
client MachineF 1234562 STOCKE   tata 112
client MachineF 1234562 RECUPERE toto  # Affiche 110
client MachineF 1234562 RECUPERE titi  # Affiche 111
client MachineF 1234562 RECUPERE tata  # Affiche 112
# Relancer le serveur [STOCKAGE] sur Machine2
client MachineF 1234562 RECUPERE toto  # Affiche 110
client MachineF 1234562 RECUPERE titi  # Affiche 111
client MachineF 1234562 RECUPERE tata  # Affiche 112		
Vérifier bien que les dernières lectures peuvent déclencher des écritures dans certains cas.

Cache par numéro de version

But

Ne pas reposer la question au serveur [FIABLE] si on connait déjà la réponse.

C'est le cache le plus simple, si la donnée a été modifiée depuis la dernière fois, on la recopie.

La structure de donnée utilisée par le cache est la même que pour le serveur de stockage.

Arguments

Le nom d'un serveur [FIABLE].

Fonctions

Ecrire un serveur [CACHE] qui a les même fonctions que le serveur [STOCKAGE]. Les seules fonctions qu'il ne passe pas directement au serveur [FIABLE] sont :

Relancer le test précédent pour vérifier qu'il fonctionne toujours (cette fois en utilisant le cache).


Last modified: Wed Apr 4 13:43:37 CEST 2001