Introduction à  JXTA

Stéphane Genaud

Les bienfaits du P2P

Les bienfaits du P2P

La découverte de ces vertus a donné l'idée de les transposer à  d'autres applications.

Le modà¨le du client-serveur omni-présent dans les systà¨mes distribués est remis en question.

La question : "Quelles propriétés des P2P peuvent convenir à  un type d'application" n'est pas mà»re.

Contexte du projet JXTA

Les protocoles JXTA

Les protocoles définissent des formats de messages XML qui décrivent les entités d'un systà¨me pair-à -pair et les procédures. Ces protocoles décrivent:

Composant d'un systà¨me JXTA

Trois type principaux de Pairs :

L'ensemble des pairs est scindé en partitions virtuelles hiérarchiques appelées peer groups. Limite les communications à  l'intérieur d'un groupe. L'idée est de former un groupe pour réaliser une tà¢che.

Identifiants et annonces

Les pairs ne sont pas identifiés par des adresses réseau car JXTA créé un réseau logique sur le réseau physiquei (overlay).

Les ressources (i.e. pairs, groupes, services et pipes) sont représentés par des advertisements (ou annonces).

Une annonce est un document XML contenant des informations pertinentes vis-à -vis du type de ressource (en particulier l'ID de la ressource).

Les annonces sont publiées pour que les autres pairs puissent découvrir une ressource.

Il faut traiter le cas des ressources qui changent d'adresse physique (e.g. IP dynamique): adresse logique nécessaire.

Services

Services (2/2)

Les protocoles sont implémentés par des services de base (Core services) de toute implémentation JXTA:

Grandes fonctionnalités

Les grandes fonctionnalités et leur réalisation en JXTA:

Découverte de ressources

Le principe général: ne pas chercher directement les ressources, mais les annonces qui donnent cette information.

JXTA procà¨de à  3 type de recherche d'annonces:

Peer discovery protocol

Le protocole Peer Discovery définit le format d'une recherche:

 <xml version="1.0" encoding="utf-8"?>
 <jxta:DiscoveryQuery>
    <Type> ... </Type>
    <Threashold> .... </Threashold>
    <PeerAdv> ... </PeerAdv>
    <Attr> ... </Attr>
    <Value> ... </Value>
 </jxta:DiscoveryQuery>

Peer discovery protocol

Format d'une réponse à  une recherche:

 <xml version="1.0" encoding="utf-8"?>
 <jxta:DiscoveryResponse>
    <Type> ... </Type>
    <Count> ... </Count>
    <Threashold> .... </Threashold>
    <PeerAdv> ... </PeerAdv>
    <Attr> ... </Attr>
    <Value> ... </Value>
    <Response Expiration="delay"> 
        ... 
    </Response>
 </jxta:DiscoveryResponse>

Discovery service

Le Discovery Service fournit des mécanismes pour manipuler les objets du Discovery protocol.

Un exemple des tutoriaux maintenus par jxta.org montre un exemple simple de découverte.
Code source java : [ JxtaAppDemo.java ].

Découverte de ressources

La découverte et la publication utilisent le service de découverte qui interroge l'ensemble des rendez-vous (rà´le de super-pairs).

JXTA utilise des tables de hachage distribuées (DHT) pour accélérer la découverte. Quand un pair publie une annonce, une fonction de hachage indique le rendez-vous qui mémorisera l'annonce.

Pour fiabiliser le service, réplication partielle des informations détenues par les rendez-vous.

Si aucun rendez-vous ne peut répondre, passage en mode "walk" : propagation de la requête à  travers les pairs (beaucoup plus lent).

Principe d'une découverte

discovery

Communication

JXTA fournit trois niveaux de communications. Du plus bas au plus élevé :

Communication - pipe

Création d'un pipe à  partir d'un advertisement:

PipeService pipe = netPeerGroup.getPipeService();

...
 
FileInputStream is = new FileInputStream("pipexample.adv");
XMLDocument document = (XMLDocument) 
 StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, is);

PipeAdvertisment pipeAdv = (PipeAdvertisement) 
  AdvertisementFactory.newAdvertisement(document);
  
...

pipe.createOutputPipe(pipeAdv);

Code source java : [ PipeExample.java ], [ PipeListener.java ]
advertisement : [ pipexample.adv ].

Communication - pipe

Ecoute sur un pipe:

// création et enregistrement de this comme PipeMsgListener.
// Quand un message arrive pipeMsgEvent est appelée

   InputPipe pipeIn = pipe.createInputPipe(pipeAdv, this);

public void pipeMsgEvent(PipeMsgEvent event) {

   Message msg = event.getMessage();
   Message.ElementIterator en = msg.getMessageElements();
   ...
}

Code source java : [ PipeExample.java ], [ PipeListener.java ]
advertisement : [ pipexample.adv ].

Exemple: publication et connexion pipe

Exemple: comment initier une connexion entre pairs ?

Chaque pair :

  1. créé un output pipe,
  2. publie l'annonce du pipe,
  3. se met à  la recherche d'output pipes.

Un pair découvrant une annonce de pipe (contenant le PipeID) peut créer un input pipe avec le pipeID et être ainsi relié au pair ayant publié l'annonce.

Programmation - Démarrage (Java)

  1. Créer localement la structure de rattachement au peer group par défaut:
      PeerGroup g = PeerGroupFactory.newNetPeerGroup();
      
    L'objet g contient alors l'implémentation de référence des services (Discovery,Membership,RendezVous,...)
  2. Construire une annonce identifiant notre groupe en particulier (en l'associant à  notre groupe) :
      PeerAdvertisement a = g.getPeerAdvertisement();
    
  3. Récupérer le protocole de découverte associé à  notre groupe
     DiscoveryService d = g.getDiscoveryService();
    

Programmation - Démarrage (Java)

Objectif : découvrir d'autres pairs en utilisant le service de découverte.

Indiquer que l'objet courant est un listener : il écoute les évà¨nements de type DiscoveryResponse.

     d.addDiscoveryListener(this);  
     

Le listener impose l'installation d'un gestionnaire pour la réception des réponse à  l'annonce :

      public void discoveryEvent(DiscoveryEvent e) {
           ...
           // code qui fait quelquechose avec e
           ...
      }
     

Programmation

Lancer une recherche indirecte (via rendezVous)

   
  d.getRemoteAdvertisements(); 

Prototype :

int getRemoteAdvertisements(String peerid, 
                            int type, 
                            String attribute, 
                            String value, 
                            int threshold) 

une annonce est publiée avec

void 	publish(Advertisement advertisement)
Publication pendant DEFAULT_LIFETIME

Programmation - Démarrage (Java)