Vous êtes sur la page 1sur 8

Appel de procédure à distance

Remote Procedure Call (RPC)

! Outil de haut niveau pour la réalisation du


Appel de procédure à distance schéma client-serveur
! Principe
site A site B

processus p processus p P(x,y, …)

Sacha Krakowiak procédure P(x,y, …) réseau


Université Joseph Fourier
Projet Sardes (INRIA et IMAG-LSR)

http://sardes.inrialpes.fr/people/krakowia

L’effet doit être identique dans les deux cas, vu de p Dans la pratique, ce
n’est pas vrai en toute rigueur

© 2003-2004, S. Krakowiak 2

Appel de procédure à distance Appel de procédure à distance!: principe de réalisation

appel emballer déballer


! Avantages attendus paramètres paramètres
" Forme et effet identiques à ceux d’un appel local
création exécution
# Applications non modifiées lors du passage à l’appel distant processus
# Mise au point locale avant répartition
attente de P(x,y)
# Simplicité d’utilisation réveil
" Abstraction déballer emballer
# Indépendance par rapport aux protocoles de communication retour résultats résultats
# Réutilisation, y compris en environnement hétérogène
! Problèmes talon talon
envoi réception serveur
" Sémantique complexe en cas de panne client param. param.
# Les processus client et serveur peuvent tomber en panne
indépendamment réception envoi
# Le réseau introduit une incertitude résultats résultats
" Restrictions sur les paramètres
# Passage de structures complexes, possible mais compliqué logiciel de communication
(sockets)
[Birrell & Nelson, 1984]

© 2003-2004, S. Krakowiak 3 © 2003-2004, S. Krakowiak 4


Appel de procédure à distance
Fonctions des talons (stubs) Problèmes de mise en œuvre

! Talon client ! Talon serveur ! Comment le client connaît-il l’adresse du serveur!?


" Représente le serveur sur le site " Représente le client sur
le site serveur ! Comment fonctionne la transmission des paramètres et résultats
client
" Reçoit l’appel sous " Modes de passage (valeur, référence ?)
" Reçoit l’appel local forme de message et " Structures complexes
" Emballe les paramètres déballe les paramètres " Représentation, emballage/déballage
" Crée un identificateur unique " Crée ou sélectionne un
" Traitement de l’hétérogénéité
pour l’appel processus (ou thread) et
lui fait exécuter la ! Comment sont traitées les erreurs!?
" Exécute l’appel distant " Hypothèses sur les erreurs, mode de détection
procédure
" Met le proc. client en attente " Emballe les résultats et " “Sémantique” de l’appel en cas d’erreur
" Reçoit et déballe les résultats les transmet à l’appelant ! Construction des talons
" Exécute le retour vers l’appelant " Génération automatique
(comme retour local de ! Gestion à l’exécution
procédure) " Lancement et arrêt du serveur, etc.
En outre, les talons doivent détecter et traiter les erreurs (délais de garde)

© 2003-2004, S. Krakowiak 5 © 2003-2004, S. Krakowiak 6

RPC : Désignation et liaison RPC : désignation et liaison

" Liaison statique : pas d’appel à un serveur de noms (ou appel


! Objets à désigner à la compilation
" Procédure appelée, site serveur " Liaison au premier appel : consultation du serveur de noms
" Propriétés souhaitées : désignation indépendante de la au premier appel seulement
localisation " Liaison à chaque appel : consultation du serveur de noms à
# possibilité de reconfiguration (pannes,régulation de chaque appel
charge)
communication logique
! Moment de liaison programme programme
" Liaison précoce (statique) ou tardive (dynamique) appelant appelé
" Statique : localisation du serveur connue à la compilation
talon service de talon
" Dynamique : localisation non connue à la compilation client désignation serveur
# Désignation symbolique des services (non liée à un site
d!’exécution communic. communic.
# Possibilité d!’implémentation ou de sélection retardée client serveur
communication physique

© 2003-2004, S. Krakowiak 7 © 2003-2004, S. Krakowiak 8


RPC : désignation et liaison utilisant un annuaire RPC : désignation et liaison utilisant le portmapper

" Si le serveur est connu (cas fréquent)!: on peut utiliser un service de


nommage local au serveur, le portmapper
programme programme
appelant appelé " Un service enregistre le n° de port de son veilleur auprès du portmapper
3 4 1 et le veilleur se met en attente sur ce port
2
talon annuaire talon " Le portmapper a un n° de port fixé par convention (111)
client serveur
5
communic. communic.
client serveur
111
portmapper
chercher (prog, version)
" 1, 2 : le serveur s’enregistre auprès de l’annuaire avec <nom, 2
adr.!serveur, n° port> 4543 1
serveur
3
" 3, 4, 5 : le client consulte l’annuaire pour trouver <adr.!serveur, n° port> à enregistrer

partir de <nom> client (prog,vers,4543)

" L’appel peut alors avoir lieu 4 appel service S


prog, version
" Schémas plus élaborés : attributs (critères de choix) 4543

© 2003-2004, S. Krakowiak 9 © 2003-2004, S. Krakowiak 10

RPC : gestion des paramètres Problèmes de représentation des paramètres

! Problèmes des paramètres ! Conventions différentes sur client et serveur


" Les espaces d’adressage de l’appelant et de l’appelé sont distincts " Exemple : little endian vs big endian
# Pas de passage par référence # Sens des octets d’une chaîne de caractères
# Les pointeurs perdent leur signification (difficulté pour passer
des structures complexes) t o t o o t o t
" Les paramètres sont transmis sur le réseau # Poids fort des nombres à gauche ou à droite
# Représentation sérialisée des structures
0 43 1 21 21 1 43 0
" Les machines client et serveur peuvent être hétérogènes
# Conversion de format # Alignement des données sur les frontières de mots
" Conventions de représentation des nombres flottants
" Conventions de représentation des structures complexes

! Limitations de taille
" Exemple : entiers sur 64 bits vs 32 bits

© 2003-2004, S. Krakowiak 11 © 2003-2004, S. Krakowiak 12


Un exemple de convention de représentation de
RPC : représentation des paramètres
paramètres : XDR

! Solution normalisée (ASN.1) ! XDR : External Data Representation (Sun)


" Syntaxe abstraite (Abstract Syntax Notation) pour représenter des " Format de transmission sur réseau
structure de données " Bibliothèque de programmes de conversion
" Codage indépendant des machines ! Ensemble de routines disponibles pour les types de base
" Outils de génération disponibles pour des machines spécifiques (de C)
" Données élémentaires
! Autres solutions " Structures simples (tableaux, chaînes, unions)
" Représentation externe commune. Exemple : Sun XDR (External " Traitement de pointeurs, gestion de mémoire
Data Representation) utilisée dans NFS
$ … conversions inutiles si client et serveur de même type
! Utilisation : programmes d’emballage/déballage
" Courante : par les générateurs automatiques de talons, dans tous les
" Conversion explicite (par le serveur) à partir d’une représentation
cas usuels
locale au client
" Avancée : directement par le programmeur, pour le traitement de
" Négociation entre client et serveur structures de données complexes

© 2003-2004, S. Krakowiak 13 © 2003-2004, S. Krakowiak 14

XDR : exemples de routines de conversion RPC : passage des paramètres

Plusieurs modes de passage sont possibles


Paramètres : pointeurs vers zones contenant les variables sous forme interne
et sous forme “réseau” (transmissible). La même routine sert dans les deux ! Passage par valeur
sens (un paramètre spécifie le sens).
" pas de problème
bool_t xdr_int(xdrs, ip) ip xdrs
XDR *xdrs sens
forme réseau
! Passage par copie-restauration
...
int *ip forme interne " A l’appel, copie des valeurs des paramètres de l’appelant
vers l’appelé
bool_t xdr_array (xdrs, arrp, sizep, maxsize, elsize, elproc)
XDR *xdrs " Au retour, copie de nouvelles valeurs pour les paramètres de
char **arrp l’appelé vers l’appelant
u_int *sizep, maxsize, elsize
xdrproc_t elproc; Copie de l’état V0
*arrp : pointeur vers tableau avant V0 V0
*sizep : nombre d’éléments de taille elsize traitement
maxsize : nombre max d’éléments après
elproc : filtre xdr pour convertir l’élément (exemple : xdr_int pour V1 V1
tableau d’entiers, etc Restauration de l’état V1

© 2003-2004, S. Krakowiak 15 © 2003-2004, S. Krakowiak 16


RPC : passage des paramètres Passage par copie-restauration et passage par référence

appelant appelé
! Passage par référence (adresse) procedure double_incr (x, y)
" Impossible puisque espaces distincts x := x+1 Quel est l’effet de :
y := y+1 a:= 0; double_incr (a, a) ?
! Palliatifs possibles V
" Interdire l’appel par référence
" Utiliser l’appel par copie-restauration
# Équivalent le plus souvent … x +1 x 0 0
y copie
# … mais pas dans tous les cas (aliasing) y +1 0 0
" Programmer à la main les procédures d’emballage-déballage +1
a 0 a 0 initial traitement
pour les structures complexes initial +1
" Nouveaux modèles de communication (mémoire virtuelle référence x 1 1
répartie) : revient à un espace commun a 2 final y restauration
1 1
a 1 final

© 2003-2004, S. Krakowiak 17 © 2003-2004, S. Krakowiak 18

RPC : “sémantique” en cas de panne RPC : traitement des défaillances

Détection de panne = expiration de délai de garde. On tente de réexecuter ! Hypothèses de défaillances


l’appel. Combien de fois la procédure a-t-elle été exécutée!? " Système de communication
# Congestion du réseau, messages retardés
! La sémantique dépend des hypothèses de # Perte de messages
# Altération de messages
pannes et du mécanisme de reprise
" Serveur
" Indéfini (pas d’hypothèses)
# Défaillance avant l’exécution de la procédure
" Au moins une fois (appel répété, plusieurs exécutions
# Défaillance pendant l’exécution de la procédure
possibles, au moins une réussit)
# Défaillance après l’exécution de la procédure
# acceptable si opération idempotente (2 appels
successifs ont le même effet que 1 appel) # Défaillance définitive ou reprise possible
" Au plus une fois (0 ou 1 fois) " Client
# on évite les exécutions répétées, mais on ne garantit pas # Défaillance pendant le traitement de la requête
le succès
" Exactement une fois (c’est l’idéal, difficile à atteindre)

© 2003-2004, S. Krakowiak 19 © 2003-2004, S. Krakowiak 20


RPC : traitement des
RPC : traitement des défaillances
défaillances

A B C A B C
E D E D
! Congestion du réseau ou du serveur
" Panne transitoire (ne nécessite pas d’action)
! Panne du serveur après émission de l!’appel
" Détection : expiration du délai de garde A ou D
" Plusieurs moments possibles
" Reprise (délai de garde A)
# Avant B, entre C et D, entre fin traitement et D
# Le talon client (A) réémet l!’appel (même identificateur) sans
intervention de l!’application # Traitement : pas fait, partiel, total
# Le service d’exécution (C) détecte que c’est une réémission " Détection : expiration du délai de garde A
$ Appel en cours : aucun effet
$ Retour déjà effectué : réémission du résultat
" Reprise
" Reprise (délai de garde D) : réémission du résultat # Le client réémet l’appel dès que le serveur redémarre
" Sémantique # Sémantique : au moins une fois
# Si défaillance transitoire : exactement une fois $ Le client ne connaît pas l’endroit de la panne

# Si défaillance permanente : détection, exception vers application # On peut faire mieux avec un service transactionnel
$ Mémorise identificateur de requête et état avant exécution

© 2003-2004, S. Krakowiak 21 © 2003-2004, S. Krakowiak 22

RPC : traitement des RPC : génération des talons


défaillances

A B C
E D
! Principe
! Panne du client après émission de l’appel " La structure des talons est bien définie et ils peuvent être
" L’appel est correctement traité créés automatiquement
# Changement d’état du serveur " Renseignements nécessaires
# Le processus exécutant courant est déclaré “orphelin”
# Dépendants de l’environnement local : procédures de
" Détection : expiration du délai de garde D, n réémissions conversion, protocole de communication
infructueuses
# Dépendants de l’application : formats des paramètres et
# Action du serveur : élimination des orphelins résultats (pour !emballage-déballage)!; c!’est l’interface
$ Consomment des ressources
de la procédure
" Reprise (après redémarrage du client)
# L’application cliente réémet l’appel (id. différent) ! Mise en œuvre
$ Sémantique : au moins une fois
" Les informations nécessaires dépendantes de l’application
$ Le serveur ne peut pas détecter qu!’il s!’agit d’une répétition
% Pas d!’incidence si idempotent sont décrites dans un langage de définition d’interfaces (IDL)
$ On peut faire mieux, si le client a un service de transactions

© 2003-2004, S. Krakowiak 23 © 2003-2004, S. Krakowiak 24


RPC : génération des talons Description d’interfaces

gcc exécutable C S
application client
client ! Interface = “contrat” entre client et serveur
proc_client.c I
talon client " Définition commune abstraite
proc_clnt.c
# Indépendante d’un langage particulier (adaptée à des
langages multiples)
description # Indépendante de la représentation des types
conversion définitions
d’interface rpcgen proc_xdr.c proc.h bibliothèques # Indépendante de la machine (hétérogénéité)
proc.x
" Contenu minimal
# Identification des procédures (nom, version)
talon serveur
proc_svc.c # Définition des types des paramètres, résultats, exceptions
application # Définition du mode de passage (IN, OUT, IN-OUT)
serveur
proc_server.c exécutable " Extensions possibles
gcc serveur
# Procédures de conversion pour types complexes
fourni par programmeur
# Propriétés non-fonctionnelles (qualité de service), non
outils et services standard)
engendré automatiquement

© 2003-2004, S. Krakowiak 25 © 2003-2004, S. Krakowiak 26

RPC : exemple de description d’interface Utilisation de rpcgen

fichier “annuaire.x” Fichiers engendrés à partir de annuaire.x :


Aides à la construction :
annuaire.h include
annuaire_clnt.c talon client annuaire_client.c modèle de programme client
/* constantes et types */ annuaire_svc.c talon serveur annuaire_server.c modèle de programme client
annuaire_xdr.c proc. conversion makefile.annuaire modele de makefile
const max_nom = 20 ;
const max_adr = 50 ; /* description de l!’interface */
const max_numero = 16 ; bool_t xdr_typenom(xdrs, objp)

program ANNUAIRE { Illustration : annuaire_xdr.c
typedef string typenom<max_nom> !!!!version V1 {
bool_t xdr_typenumero(xdrs, objp)
typedef string typeadr<max_adr> …
void INIT(void) = 1; bool_t xdr_typeadr(xdrs, objp) bool_t xdr_personne(xdrs, objp)
typedef string int AJOUTER(personne p) = 2 ; !!!!register XDR *xdrs;
typenumero<max_numero> int SUPPRIMER (personne p) = 3 ; !!!!typeadr *objp; !!!register XDR *xdrs;
personne CONSULTER (typenom nom) = 4 ; { !!!typeadr *objp;
struct personne { }=1; !!!!register long *buf; {
typenumero numero ; } = 0x23456789 ; !!!register long *buf;
typenom nom ; !!!!if (!xdr_string(xdrs, objp, max_numero))
typeadr adresse ; return (FALSE) ; !!!!if (!xdr_typenumero(xdrs, &objp->numero))
}; !!!!return (TRUE) ; return (FALSE) ;
} !!!!if (!xdr_typenom(xdrs, &objp->nom))
return (FALSE) ;
typedef struct personne personne ; !!!!if (!xdr_typeadr (xdrs, &objp->adresse))
return (FALSE) ;
!!!!return (TRUE) ;
}
© 2003-2004, S. Krakowiak 27 © 2003-2004, S. Krakowiak 28
Utilisation de rpcgen

Exemple : modèle de programme client : annuaire_client.c


main(argc, argv)
int argc ; char * argv ;
{
CLIENT *clnt ;
char * host

if (argc <2) {
printf(“usage: %s server_host\n“, argv[0]) ;
exit(1)
{
host = argv[1] ;

clnt = clnt_create (host, ANNUAIRE, V1, “netpath”) ; /* “poignée” d!’accès au serveur */


if (clnt == (CLIENT *) NULL {
{clnt_pcreateerror(host) ;
exit(1) ;
{
… /* saisir paramètres */
result_2 = ajouter_1(&ajouter_1_arg, clnt)
if (result_2 == (int *) NULL) {
clnt_perror(clnt, “call failed“) ;
{
… /* afficher résultats */
}

© 2003-2004, S. Krakowiak 29