@ Vincent Englebert -
UNamur 1
Middlewares Orientés ObjetsMiddlewares Orientés Objets
Conditions
Ces matériaux pédagogiques devenus obsolètes dans notre cursus
sont distribués en l’état et ne sont plus mainte...
@ Vincent Englebert - UNamur 3
Bibliographie
Les documents de l'OMG
le document de référence de Corba
le document de mappi...
@ Vincent Englebert - UNamur 4
PlanPlan
Introduction
Interface Description Language (IDL)
Architecture
Présentation global...
@ Vincent Englebert - UNamur 5
IntroductionIntroduction
L'OMG (Object Management Group)
http://www.omg.org
toutes les spéc...
@ Vincent Englebert - UNamur 6
Motivation
CORBA peut être considéré comme une architecture de référence qui
permet de comp...
@ Vincent Englebert - UNamur 7
Là où on ne l'attend pas…
[July 13, 2005] PrismTech Achieves Major Technical Breakthrough P...
@ Vincent Englebert - UNamur 8
La vision
Le système est perçu comme un ensemble d'objets et
d'applications "utilisatrices"...
@ Vincent Englebert - UNamur 9
FirewallFirewall
Objets répartis
UNIX
NT
MACOS
W-CE
Java
C++
Cobol
LispC++
Smalltalk
Firewa...
@ Vincent Englebert - UNamur 10
Objets répartis
NT
@ Vincent Englebert - UNamur 11
CORBACORBA
Object Request Broker (ORB)
l’ORB est un bus qui permet de répartir des objets ...
@ Vincent Englebert - UNamur 12
Le langage IDL
(Interface Description Language)
Le langage IDL
(Interface Description Lang...
@ Vincent Englebert - UNamur 13
Exemples d’hétérogénéité sémantiqueExemples d’hétérogénéité sémantique
Template
généricité...
@ Vincent Englebert - UNamur 14
L’Objet distribué en CORBAL’Objet distribué en CORBA
Un objet distribué en CORBA est perçu...
@ Vincent Englebert - UNamur 15
Utilisation d’IDLUtilisation d’IDL
C++ COBOLJava
BUS CORBA
IDL
Idl2c++ idl2java idl2cobol
...
@ Vincent Englebert - UNamur 16
Commentaires
/* ceci est un commentaire */
// ceci aussi
Identificateur
id :: = lettre car...
@ Vincent Englebert - UNamur 17
IDL est un langage fortement typé
Types scalaires
short entier 16 bits signé
unsigned shor...
@ Vincent Englebert - UNamur 18
Définitions de type
définition-de-type ::= typedef type identificateur
typedef unsigned sh...
@ Vincent Englebert - UNamur 19
Interface
Une interface est une description d’un ensemble d’opérations qu’un client peut s...
@ Vincent Englebert - UNamur 20
Opération
opération ::= [ oneway ] op_type identificateur paramètres [ raise_exp ] [ conte...
@ Vincent Englebert - UNamur 21
local: certaines interfaces peuvent être déclarées locales. Ceci signifie
permet de décrir...
@ Vincent Englebert - UNamur 22
CORBA/IDL C++ Java
short CORBA::Short short
unsigned short CORBA::Ushort short
long CORBA:...
@ Vincent Englebert - UNamur 23
Règles de mappingRègles de mapping
CORBA/IDL C++ Java
module namespace package
type élémen...
@ Vincent Englebert - UNamur 24
ArchitectureArchitecture
@ Vincent Englebert - UNamur 25
Client
IDLStub
Client
IDLStub
Client
IDLStub
ORB
Dynamic
Invocation
Client
IDLStub
ORB API...
@ Vincent Englebert - UNamur 26
Dynamic Skeleton Interface (DSI)
Ce composant répond aux requêtes émanant
des clients. Cet...
@ Vincent Englebert - UNamur 27
ORB
Interface
Repository
Implementation
Repository
Interface Repository (IR)
L’IR est un s...
@ Vincent Englebert - UNamur 28
CORBA::ObjectCORBA::Object
Tous les objets supportant une interface CORBA héritent implici...
@ Vincent Englebert - UNamur 29
Exemple
Établir une plateforme de communication entre des courtiers en
assurances et des c...
@ Vincent Englebert - UNamur 30
Stub
compagnie
Zurich
ORB
Dynamic
Invocation
Stub
Assuré
ORB API
Courtier en assurances
Dy...
@ Vincent Englebert - UNamur 31
Dynamic
Skeleton
skeleton
Compagnie
Zurich
ORB API
Zurich Assurance ServeurZurich Assuranc...
@ Vincent Englebert - UNamur 32
module MediateurAssurance {
typedef string<80> T_police;
exception PasEnregistre { string ...
@ Vincent Englebert - UNamur 33
P
«interface»
ZURICH_compagnie
demande_nvelle_police
«interface»
AXA_Compagnie
«oneway» de...
@ Vincent Englebert - UNamur 34
ORB
ORBORB
Client
IDLStub
Client
IDLStub
Client
IDLStub
Client
IDLStub
Client
IDLStub
Clie...
@ Vincent Englebert - UNamur 35
Stub
Compagnie
Zurich
Stub
Compagnie
Zurich
Dynamic
Invocation
Dynamic
Invocation
Stub
Ass...
@ Vincent Englebert - UNamur 36
Le Bus CORBALe Bus CORBA
L’OMG définit les services rendus par le bus (ORB), paspas son im...
@ Vincent Englebert - UNamur 37
@ Vincent Englebert - UNamur 38
local interface ORB {
typedef string ObjectId;
typedef sequence <ObjectId> ObjectIdList;
s...
@ Vincent Englebert - UNamur 39
Le protocole GIOPLe protocole GIOP
L’OMG a défini un protocole générique réseau à usage gé...
@ Vincent Englebert - UNamur 40
A. Le format CDRA. Le format CDR
Ce format spécifie un format de données pour représenter
...
@ Vincent Englebert - UNamur 41
Exemple d’alignement
Alignment of Data Items
Developers who undertake the migration to the...
@ Vincent Englebert - UNamur 42
Caractéristiques
Les valeurs IDL ont une longueur déterminée par leur type dans le flux
(s...
@ Vincent Englebert - UNamur 44
B. Interoperable Object Request / IORB. Interoperable Object Request / IOR
1. Numéro de ve...
@ Vincent Englebert - UNamur 45
C. Hypothèses sur la couche transportC. Hypothèses sur la couche transport
connection-orie...
@ Vincent Englebert - UNamur 46
@ Vincent Englebert - UNamur 47
D. Les messages GIOPD. Les messages GIOP
Type de message Émetteur Tag Version de GIOP
Requ...
@ Vincent Englebert - UNamur 48
@ Vincent Englebert - UNamur 49
Request
Ce message encode les invocations
d’opération et les accesseurs. Le
message est co...
@ Vincent Englebert - UNamur 50
Request
@ Vincent Englebert - UNamur 51
Reply
LOCATION_FORWARD.
The server asks the client to send the request to another object. ...
@ Vincent Englebert - UNamur 52
Cancel & LocateRequest & LocateReply
@ Vincent Englebert - UNamur 53
Spécialisation de GIOP: IIOPSpécialisation de GIOP: IIOP
GIOP
TCP-IP
IIOP
...OSIIPX
IIOP: ...
@ Vincent Englebert - UNamur 54
Interopérabilité entre Bus CORBAInteropérabilité entre Bus CORBA
Motivations
L’OMG définit...
@ Vincent Englebert - UNamur 55
Inter-ORB Bridge (Half-Bridge)
même CPU (cfr. exemple)
deux CPUs avec un protocole commun
...
@ Vincent Englebert - UNamur 56
L’Adaptateur d’objets: POAL’Adaptateur d’objets: POA
ORB
Client
IDLStub
Client
IDLStub
Cli...
@ Vincent Englebert - UNamur 57
Fichier IDL = Collection d’interfaces
Fichier IDL
IDL2xxx
xxx=java, cpp, cobol, …
fichier ...
@ Vincent Englebert - UNamur 58
RootPOA
Default servant
POA 1
Object id
Object id
Object id
Object id
Object id
Object id
...
@ Vincent Englebert - UNamur 59
Il existe un POA remarquable: « RootPOA »
Un POA peut être le père de plusieurs POA
Un POA...
@ Vincent Englebert - UNamur 60
Default servant
@ Vincent Englebert - UNamur 61
CORBA fait une distinction entre « transient IOR » et « persistent IOR » (cfr.
Lifespan po...
@ Vincent Englebert - UNamur 62
Le gestionnaire de POAsLe gestionnaire de POAs
Le POA Manager peut gérer
simultanément plu...
@ Vincent Englebert - UNamur 63@jacorb
@ Vincent Englebert - UNamur 64
@ Vincent Englebert - UNamur 65
Les servants sont créés à la volée et
placés dans la table du POA. Ils
pourront être désal...
@ Vincent Englebert - UNamur 66
Les servants sont créés à la volée
mais à la seule fin d’exécuter une
et une seule requête...
@ Vincent Englebert - UNamur 67
Cette architecture permet de
De gérer des objets persistants
le ServantManager peut charge...
@ Vincent Englebert - UNamur 68
Procédure de déploiementProcédure de déploiement
module Business {
interface Compte;
inter...
@ Vincent Englebert - UNamur 69
import java.io.*;
import Business.*;
public class Serveur {
private static void printRefer...
@ Vincent Englebert - UNamur 70
public class CompteImpl extends Business.ComptePOA {
private String nom;
private int solde...
@ Vincent Englebert - UNamur 71
//
// Interface implementation definition : Banque
//
public class BanqueImpl extends Busi...
@ Vincent Englebert - UNamur 72
//
// Interface implementation definition : Banque
//
public class BanqueImpl extends Busi...
@ Vincent Englebert - UNamur 73
import java.io.*;
import Business.*;
public class Client {
/** Creates new Client */
publi...
@ Vincent Englebert - UNamur 74
Passage par valeur en Corba.Passage par valeur en Corba.
Par défaut, les objets corba sont...
@ Vincent Englebert - UNamur 75
idl2java
valuetype Bouchon {
private long code;
private Emetteur emetteur;
public string r...
@ Vincent Englebert - UNamur 76
public interface ValueFactory {
java.io.Serializable read_value(org.omg.CORBA.portable.Inp...
@ Vincent Englebert - UNamur 77
abstract class Bouchon {
attributes & operations
}
interface CORBA.portable.StreamableValu...
@ Vincent Englebert - UNamur 78
interface Emetteur {
void confirmer(in long code, in string commentaire);
void dementir(in...
@ Vincent Englebert - UNamur 79
Serveur Factory Client Factory
x:avaluetype
init
requête
x':avaluetype
ORB
t:repository Id...
@ Vincent Englebert - UNamur 80
mode dynamique
L'héritage est étendu aux value types et aux interfaces indifféremment:
hér...
@ Vincent Englebert - UNamur 81
interface Exemple {
void print();
}
valuetype ExempleVal supports Exemple {
void printLoca...
@ Vincent Englebert - UNamur 82
interface ExempleVal extends Exemple
class ExempleImpl implements Exemple {
}
interface Ex...
@ Vincent Englebert - UNamur 83
le passage par valeur permet de « délocaliser » des appels d'opération.
Ainsi des appels (...
@ Vincent Englebert - UNamur 84
Le repository d'interfacesLe repository d'interfaces
@ Vincent Englebert - UNamur 85
CORBA::ObjectCORBA::Object
Tous les objets supportant une interface CORBA héritent implici...
@ Vincent Englebert - UNamur 86
Le repository d'interfaces contient une description des interfaces,
modules, … définis dan...
@ Vincent Englebert - UNamur 87
interface Client {
attribute string name;
};
interface Client {
attribute string name;
att...
@ Vincent Englebert - UNamur 88
@ Vincent Englebert - UNamur 89
Localisation d’Objets DistribuésLocalisation d’Objets Distribués
Inventaire des objets dis...
@ Vincent Englebert - UNamur 90
module CosNaming {
typedef string Istring;
struct NameComponent { Istring id; Istring kind...
@ Vincent Englebert - UNamur 91
high availability !
stable 
accès fréquents et
cruciaux , mais les
données peuvent être
c...
@ Vincent Englebert - UNamur 92
Techniques de résolution
Résolution récursive (Corba Naming Service)
Object resolve(in Nam...
@ Vincent Englebert - UNamur 93
Techniques de résolution
Résolution itérative
Object resolve(in Name n)
Contexte.resolve(<...
@ Vincent Englebert - UNamur 94
Comparaison
Itérative
 les serveurs sont moins chargés
- (mais) plus de gestion sur le cl...
@ Vincent Englebert - UNamur 95
résolution récursive de <nl,vu,cs,ftp>
avec caching et résultats étendus
@tanenbaum
inform...
@ Vincent Englebert - UNamur 96
Les répertoires fournis dans les packages ne sont généralement pas prévus pour gérer
de gr...
@ Vincent Englebert - UNamur 97
L’ORB offre une opération pour obtenir le répertoire principal (root)
module CORBA {
inter...
@ Vincent Englebert - UNamur 98
Référencer un IOR sous format textuel
URL Corba:
CORBALOC
corbaloc://{[version du protocol...
@ Vincent Englebert - UNamur 99
Négociations de servicesNégociations de services
Le concept de répertoire offre une descri...
@ Vincent Englebert - UNamur 100
Un trader décrit un (des) objet en terme d’un ensemble de services
qu’il peut rendre.
Exe...
@ Vincent Englebert - UNamur 101
interface ImprimanteMatricielle;
Type=« matricielle »;
is_busy=true;
is_fast=true;
qualit...
@ Vincent Englebert - UNamur 102
Fédération de tradersFédération de traders
QUERY
Local/if_no_local/always
Local/if_no_loc...
@ Vincent Englebert - UNamur 103
interface
CosTrading::ImportAttributes
+def_search_card:unsigned long
+max_search_card:un...
@ Vincent Englebert - UNamur 104
@ Vincent Englebert - UNamur 105
@ Vincent Englebert - UNamur 106
@ Vincent Englebert - UNamur 107
Questions
Trouvez des applications qui pourraient bénéficier du support du
trading servic...
@ Vincent Englebert - UNamur 108
Gestion du cycle de vie (création)Gestion du cycle de vie (création)
Dans un langage de p...
@ Vincent Englebert - UNamur 109
Tentative 1
:Client
c:Compte
fc:FabriqueCompte:Naming
Resolve(« FabriqueCompte »
fc
Creat...
@ Vincent Englebert - UNamur 110
Tentative 2
:Client
c:Compte
fc:FabriqueCompte:Naming
resolve(« FactoryFinder »
ff
find_f...
@ Vincent Englebert - UNamur 111
La localisation des objets nécessaires à la création d’objets distribués
est maintenant c...
@ Vincent Englebert - UNamur 112
Gestion du cycle de vie (destruction)Gestion du cycle de vie (destruction)
Détruire un ob...
@ Vincent Englebert - UNamur 113
Localisation des objets mobilesLocalisation des objets mobiles
@ Vincent Englebert - UNamur 114
Problème
Soit C un composant qui peut migrer d'une machine à une autre.
Identifier ce com...
@ Vincent Englebert - UNamur 115
Application 1 Application 2
Solution 1. Chaîne de Proxy.
proxy C
Client
+ Le client conse...
@ Vincent Englebert - UNamur 116
s
s
foo’: actif
ortho: servants, suspendus
foo’
@ Vincent Englebert - UNamur 117
Solution 2. Correction du client
Corriger l'information du client
Client
BA
FOO:
foo
REQU...
@ Vincent Englebert - UNamur 118
A
a →B, b →B,c →B
B
a →E, b →E, c → E
C D
E
a → I, b → I, c → J
F G H
I
a → 1, b → 2
J
c ...
@ Vincent Englebert - UNamur 119
A
a →B, b →B,c →B
B
a →E, b →E, c → E
C D
E
a → I, b → I, c → J
F G H
I
a → 1, b → 2
J
c ...
@ Vincent Englebert - UNamur 120
A
a →B, b →B,c →B
B
a →E, b →E, c → E
C D
E
a → I, b → I, c → J
F G H
I
a → 1, b → 2
J
c ...
@ Vincent Englebert - UNamur 121
A
a →B, b →B,c →B
B
a →E, b →E, c → E
C D
E
a → I, b → I, c → J
F G H
I
a → 1, b → 2
J
c ...
@ Vincent Englebert - UNamur 122
Exercices
Si pour un raison quelconque, l'ordinateur hébergeant un nœud de
l'arbre doit ê...
@ Vincent Englebert - UNamur 123
Limitations
On doit en permanence parcourir l'arbre pour retrouver l'adresse d'une entité...
@ Vincent Englebert - UNamur 124
@ Vincent Englebert - UNamur 125
Gestion des référencesGestion des références
@ Vincent Englebert - UNamur 126
Introduction
À partir du moment où l'on peut référencer des entités distantes (IOR
par ex...
@ Vincent Englebert - UNamur 127
La gestion des références avec des objets locaux
Principe du Mark & Sweep
98.2928
'a'
123...
@ Vincent Englebert - UNamur 128
Comptage de référence
Idée: le skeleton maintient un compteur avec le nombre de stubs dan...
@ Vincent Englebert - UNamur 129
Problème de synchronisation
Il faut détecter la perte de messages
Il faut détecter la rép...
@ Vincent Englebert - UNamur 130
Problème de race concurrence
Race concurrence
P1 passe une référence à P2
P1 informe le s...
@ Vincent Englebert - UNamur 131
Technique Weight Watcher
Un poids est assigné à chaque objet distribué
Lorsqu'un stub est...
@ Vincent Englebert - UNamur 132
Question
Que se passe t il avec ce type de programme ?
Soit X une référence vers O

exéc...
@ Vincent Englebert - UNamur 133
Amélioration du weight watcher avec des chaînes
lorsque le poids local d'un stub devient ...
@ Vincent Englebert - UNamur 134
Gestion avec une liste des référents
plutôt que maintenir un simple compteur, l'idée est ...
@ Vincent Englebert - UNamur 135
Garbage collector distribué
Gestion des références cycliques
Le problème des références c...
FIN
Prochain SlideShare
Chargement dans…5
×

Cours Middlewares orientés objets

1 400 vues

Publié le

Publié dans : Logiciels
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 400
Sur SlideShare
0
Issues des intégrations
0
Intégrations
652
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • loc_needs_addessing_mode: demande de rénogocier la technique d’adressage de l’objet cible
  • Les applications ont accès à deux instances de C en même temps.
    Pour éviter cela il faut d’abord supprimer l’entité du répertoire et puis la rajouter, mais on rend alors l’entité invisible durant le temps de la transaction.
  • les transient IOR permettent de continuer à référencer des objets qui ont été déplacés puisque l’on sera notifié de l’absence de l’objet cible
  • communication synchrone -&amp;gt; délai supplémentaire
  • le poids total diminue progressivement et l’objet ne pourra plus être utilisé
  • Cours Middlewares orientés objets

    1. 1. @ Vincent Englebert - UNamur 1 Middlewares Orientés ObjetsMiddlewares Orientés Objets
    2. 2. Conditions Ces matériaux pédagogiques devenus obsolètes dans notre cursus sont distribués en l’état et ne sont plus maintenus. Tout emprunt vers d’autres supports respectera les conditions de la licence Creative Commons Attribution telle que déclarée dans l’entête en référençant: Source: Université de Namur Belgique – Faculté d’informatique – V. Englebert Si jamais, une information était incorrectement référencée dans ce document, les ayants-droits sont priés de me contacter afin de corriger le document: vincent.englebert (at) unamur.be @ Vincent Englebert – Unamur 2
    3. 3. @ Vincent Englebert - UNamur 3 Bibliographie Les documents de l'OMG le document de référence de Corba le document de mapping IDL – Java le document de référence pour le Naming Service le document de référence pour le Trading Service le document de référence pour l'Object Transaction Service @Book{tanenbaum02-ds, author = {Andrew S. Tanenbaum, Maarten van Steen}, title = {Distributed Systems: Principles and Paradigms}, publisher = prentice, year = 2002, isbn = 0130888931 }
    4. 4. @ Vincent Englebert - UNamur 4 PlanPlan Introduction Interface Description Language (IDL) Architecture Présentation globale Le bus CORBA Intéropérabilité entre bus CORBA Le protocole GIOP CDR GIOP IIOP L’adaptateur d’objet (POA) Procédure de Déploiement d’une Application / Exemple. Passage par Valeur Localisation d’Objets Distribués Négociation de Services Gestion du Cycle de Vie
    5. 5. @ Vincent Englebert - UNamur 5 IntroductionIntroduction L'OMG (Object Management Group) http://www.omg.org toutes les spécifications sont accessibles en ligne organisation fondée en 1989 regroupe plus de 800 sociétés membres (privé/public) produits UML 2.0 Unified Modeling Language Langage de modélisation MOF Meta-Object Facility Méta-modèle CORBA 3.0 Common Object Request Broker Architecture CCM
    6. 6. @ Vincent Englebert - UNamur 6 Motivation CORBA peut être considéré comme une architecture de référence qui permet de comprendre d'autres technologies comme les web-services RMI DCOM .NET etc etc
    7. 7. @ Vincent Englebert - UNamur 7 Là où on ne l'attend pas… [July 13, 2005] PrismTech Achieves Major Technical Breakthrough Porting a C++ CORBA(R) ORB to a Digital Signal Processor (DSP) WASHINGTON --(Business Wire)-- July 13, 2005 -- Allowing more Real-time and Embedded Applications Developers to Reap the Benefits of CORBA Technology Today at the OMG(TM)'s Real-time and Embedded Systems Workshop, PrismTech a leading provider of productivity tools and middleware, announced it had achieved a major technical breakthrough by porting its OpenFusion e*ORB SDR C++ edition product to a Digital Signal Processor (DSP). Digital Signal Processing is a key technology fuelling innovative, high growth applications for many of today's fast growing markets such as digital wireless, broadband access, digital audio, high-resolution imaging and digital motor control. DSP is unique because it processes data in real-time making it perfect for applications that cannot tolerate any delays. Running CORBA middleware on a DSP achieves flexibility and simplifies integration by exposing the services offered by the DSP far more widely than is possible with any other technology. Any application where a DSP is integrated with external systems of any kind benefits from the simplified integration and enhanced flexibility provided by CORBA. Traditional thinking suggested that due to the nature of its highly restricted environment that it was not possible to run a C++ ORB on a DSP. Now PrismTech has been able to achieve a major breakthrough by porting its OpenFusion e*ORB C++ edition to a DSP. This has been achieved through the unique micro-kernal architecture of the C++ ORB combined with footprint optimization. "One example of the significant benefits that can be gained from hosting OpenFusion e*ORB SDR C++ edition on a DSP is in software defined radio (SDR) development," said Andrew Foster, Product Manager, PrismTech. "Efficiently hosting a C++ ORB on a DSP is a major move forward in standardizing the interfaces in a SDRs signal processing chain and improving waveform portability. The fact that a C++ CORBA component can be hosted on a DSP means that a unified C++ language binding can now be used across GPPs and DSPs, something that was previously impossible." OpenFusion e*ORB SDR is available for the Texas Instruments C64x family of DSPs. About PrismTech Founded in 1992, with offices in the USA and Europe, PrismTech is a privately held software products company. PrismTech serves international Fortune 500 customers in the telecommunications, data communications, defense and aerospace sectors. PrismTech is an acknowledged leader in productivity tools and middleware, with solutions ranging from wide-scale integration to embedded real-time systems, supporting applications from operations support systems (OSS) through to software-defined radio (SDR). For additional information about PrismTech, visit the web site at http://www.prismtech.com. CORBA is a registered trademark of the Object Management Group, Inc in the U.S. and other countries. OpenFusion and e*ORB SDR are trademarks of PrismTech. All other trademarks are the property of their respective owners. http://www.tmcnet.com/usubmit/2005/jul/1162959.htm
    8. 8. @ Vincent Englebert - UNamur 8 La vision Le système est perçu comme un ensemble d'objets et d'applications "utilisatrices". Ces objets peuvent être répartis dans des applications différentes développées avec des langages différents sur des machines hôtes différentes, géographiquement éloignées avec des systèmes d'exploitation différents communicant avec des protocoles réseaux différents et intégrés à différents environnements de déploiement serveur de sécurité serveur transactionnel serveur de bases de données … Conceptuellement, ces objets sont rendus interopérables (ils peuvent s'appeler l'un l'autre ou être utilisés par d'autres applications utilisatrices) grâce à un "bus" de communication: l'ORB.
    9. 9. @ Vincent Englebert - UNamur 9 FirewallFirewall Objets répartis UNIX NT MACOS W-CE Java C++ Cobol LispC++ Smalltalk Firewall
    10. 10. @ Vincent Englebert - UNamur 10 Objets répartis NT
    11. 11. @ Vincent Englebert - UNamur 11 CORBACORBA Object Request Broker (ORB) l’ORB est un bus qui permet de répartir des objets distribués et de les rendre interoperables. Object Services un ensemble de services généraux au dessus de l’ORB naming event persistent object service life-cycle concurrency externalization relationship transaction query property time Common Facilities modèles d’applications qui résolvent des problèmes communs à de nombreuses architectures distribuées administration système gestion des utilisateurs gestion des tâches Corba Domains médecine, transport, simulation, banques, BD génomiques, ... security trader collection versioning licence notification Site du cours: suivre Corba / OMG
    12. 12. @ Vincent Englebert - UNamur 12 Le langage IDL (Interface Description Language) Le langage IDL (Interface Description Language)
    13. 13. @ Vincent Englebert - UNamur 13 Exemples d’hétérogénéité sémantiqueExemples d’hétérogénéité sémantique Template généricité record arrays union type constructor list interface virtual class héritage (simple/multiple) overriding dynamic typing IDL (Interface Description Language) est un language de description d’objets distribués neutre. Module, objet, méthode, héritage, … indépendant des langages de programmation et des architectures L’OMG définit des règles strictes de mapping d’IDL vers les langages de programmation. Exemples: héritage multiple vers Java méthode vers C, COBOL héritage vers C, COBOL int vers COBOL etc.
    14. 14. @ Vincent Englebert - UNamur 14 L’Objet distribué en CORBAL’Objet distribué en CORBA Un objet distribué en CORBA est perçu comme une entité offrant un certain nombre de services accessibles à distance. module NASA { typedef unsigned long Delai; typedef sequence<Delai> SequenceBooster; interface engin { attribute string comment; readonly attribute string nom_engin; void decoller(in Delai d); boolean statusDecollage(in string reservoire, out long niv_Hydrogene, inout Delai t); }; interface fusee: engin { oneway void setSequenceBoost(in SequenceBooster boost); }; }; Définition d’objet méthode opération Attribut d’état Appel oneway (asynchrone) entrée/sortie/entrée-sortie Type de données héritage
    15. 15. @ Vincent Englebert - UNamur 15 Utilisation d’IDLUtilisation d’IDL C++ COBOLJava BUS CORBA IDL Idl2c++ idl2java idl2cobol 1. Modélisation par un diagramme de classes des composants répartis que l'on va trouver dans le système d'informations distribué 2. Chaque classe définira un contrat proposant les services offerts par chaque objet distribué de cette classe à ses clients potentiels. a) applications b) objets répartis 3. Chaque classe sera traduite en IDL et deviendra une "interface" corba 4. La compilation de l'IDL produira un framework dans des langages cible que chaque responsable informatique pourra étendre pour fournir une implémentation.
    16. 16. @ Vincent Englebert - UNamur 16 Commentaires /* ceci est un commentaire */ // ceci aussi Identificateur id :: = lettre caractere* caractere ::= lettre | chiffre |'_’ lettre::='a’ ..'z’'A’ ..'Z’ chiffre::='0’ ..'9’ Interface le langage IDL permet de spécifier de manière abstraite les services rendus par un objet distant indépendamment de son implémentation et de la sémantique du langage dans lequel il a été implémenté Un module contient des définitions de constantes des types de données des interfaces des exceptions d’autres modules Un identificateur à une portée locale au module/interface qui le contient Un module est un espace ouvert qu’il est possible de compléter a posteriori. Il structure les définitions de données permettant ainsi d’éviter des conflits de nom module Fortis { module CGER { interface customer … } module Generale { interface customer … } } Un identificateur peut être référencé dans un module comme suit: Math::Trigo::PI : l’identificateur PI dans le module Trigo dans le module Math
    17. 17. @ Vincent Englebert - UNamur 17 IDL est un langage fortement typé Types scalaires short entier 16 bits signé unsigned short idem non signé long entier 32 bits signé unsigned long idem non signé long long entier 64 bits signés unsigned long long idem non signé float nombre flottant 32 bits IEEE double nombre flottant 64 bits IEEE long double nombre flottant 128 bits boolean booléen TRUE et FALSE octet octet 8 bits char caractère 8 bits ISO latin-1 wchar caractère au format international (unicode) string chaîne de caractères wstring chaîne de caractères au format international Octet: ne subit aucune modification sur le bus CORBA. String: non borné, mais string<80> est autorisé Constantes déclaration ::= const identificateur '=’ expression const string UneChaine = « Namur, ville capitale » ; const double PI= 3 + 0.1415 ; const char accept=‘y’ ; const long TAILLE=20 ;
    18. 18. @ Vincent Englebert - UNamur 18 Définitions de type définition-de-type ::= typedef type identificateur typedef unsigned short Jour Types complexes énumérations énumeration ::= enum identificateur' {‘ identificateur {' ,’ identificateur }*' }’ enum PersonneID { etudiant, enseignant, etranger }; structures structure ::= struct identificateur' {‘ { champ } +' }’ champ ::= type identificateur' ;’ struct Adresse { string rue; long numero; string ville ; }; unions union TypePersonne switch (PersonneID) { case etudiant: long numero_carte; case enseignant: string numero_securite_sociale; case etranger: wstring nom_prenom_pays; }; tableaux tableau ::= type dimension { dimension } * dimension ::=' [‘ cst_entier_positif' ]’ typedef float[TAILLE][TAILLE] Matrice; séquences séquence::= sequence' <‘ type' >’ | sequence' <‘ type' ,’ cst_entier_positif' >’ Si une borne est précisée, elle mentionne le nombre maximal d’éléments que l’on peut stocker dans une séquence. La taille de la séquence est disponible à l’exécution. sequence list_adresse < Adresse , 3 > ;
    19. 19. @ Vincent Englebert - UNamur 19 Interface Une interface est une description d’un ensemble d’opérations qu’un client peut solliciter d’un objet. Le langage IDL permet de décrire syntaxiquement les interfaces. Une interface peut hériter d’autres interfaces Une interface peut posséder des attributs (attribute) des exceptions (exception) des opérations des constantes (const) des déclarations de types (typedef) Attributs attribut ::= [ readonly ] attribute type identificateur {' ,’ identificateur }* Une déclaration d’attribut est équivalente à la déclaration de méthodes d’accès: readonly attribute String name; String __get_name(); void __set_name(in String name); /* si pas readonly */ Exceptions un type d’exception se définit comme une structure à la différence du mot clef exception à la place de struct. Ce type d’information est utilisé pour retourner une information lorsqu’un problème survient à l’exécution d’une opération. exception division_par_zero { long numerateur; } Une interface est considérée comme un type et dès lors, il est permis d’utiliser une interface comme type de résultat, de paramètre, ou d’attribut.
    20. 20. @ Vincent Englebert - UNamur 20 Opération opération ::= [ oneway ] op_type identificateur paramètres [ raise_exp ] [ context_expr ] op_type ::= type | void raise_exp ::=raises' (‘ identificateur {' ,’ identificateur }*' )’ context_exp ::= non abordé dans ce cours paramètres ::=' (‘ paramètre*' )’ paramètre ::= [ in | out | inout ] type identificateur si une opération est oneway l’invocation de cette méthode est réalisée de manière asynchrone pas de paramètres out ou inout pas d’exception sémantique besteffort, l’opération sera exécutée 0 ou 1 fois (exemple: panne de réseau). La présence d’une clause raises signifie que l’exécution peut lever une exception, dans ce cas, les paramètres out et inout sont indéterminés. Outre les exceptions définies par l’utilisateur, des exceptions système peuvent aussi être levées. La surcharge est interdite, un nom = 1! Opération Héritage Un sous-type possède l’ensemble des caractéristiques figurant dans les super-types. Il ne peut y avoir de conflit de nom. La structure en diamant ne pose pas de problème. Tous les objets supportant une interface CORBA héritent implicitement de l’interface CORBA::Object. Interface A Interface B Interface C Interface D
    21. 21. @ Vincent Englebert - UNamur 21 local: certaines interfaces peuvent être déclarées locales. Ceci signifie permet de décrire des objets non distribués avec l’IDL. L’OMG définit ainsi l’architecture interne de chaque application avec l’IDL. Le passage par valeur IDL permet de définir des types d'objets dont les instances sont passées par valeur dans les appels distants plutôt que par référence (dans le cas des interfaces). Ce point est présenté dans la suite de l'exposé.
    22. 22. @ Vincent Englebert - UNamur 22 CORBA/IDL C++ Java short CORBA::Short short unsigned short CORBA::Ushort short long CORBA::Long int unsigned long CORBA::Ulong int long long CORBA::LongLong long unsigned long long CORBA::ULongLong long float CORBA::Float float double CORBA::Double double long double CORBA::LongDouble not yet defined boolean CORBA::Boolean boolean octet CORBA::Octet byte char CORBA::Char char Règles de mappingRègles de mapping
    23. 23. @ Vincent Englebert - UNamur 23 Règles de mappingRègles de mapping CORBA/IDL C++ Java module namespace package type élémentaire définition de type type élémentaire constante constante attribut constant définition de type typedef classe énumération enum classe structure structure classe union classe classe tableau tableau tableau séquence classe tableau interface classe interface référence d'objet instance instance attribut 1/2 fonctions 1/2 fonctions opération fonction fonction invocation appel -> appel . passage de paramètres val/&/* valeur/Holder exception classe classe
    24. 24. @ Vincent Englebert - UNamur 24 ArchitectureArchitecture
    25. 25. @ Vincent Englebert - UNamur 25 Client IDLStub Client IDLStub Client IDLStub ORB Dynamic Invocation Client IDLStub ORB API ClientClient • Object • Process • DBMS Stub/ Static Invocation Interface (SII) C’est le résultat de la projection des descriptions IDL dans un langage de programmation donné. Le stub est le proxy qui représente un objet distant, et par lequel l’application cliente pourra émettre ses requêtes. Le stub emballe les requêtes, déballe les résultats, et procède aux appels nécessaires à l’ORB pour envoyer la requête. Un objet distant peut posséder plusieurs stubs selon le langage utilisé pour implémenter l’application cliente (COBOL/C+ +/Java/…). Dynamic Invocation Interface (DII) Permet de construire des requêtes dynamiquement. Ce mécanisme est plus complexe. Il permet néanmoins d’écrire des applications clientes qui découvrent leur contexte (la nature des composants distribués qui les entourent) au moment de l’exécution. Exemple: browser, compilateur, administration, ... ORB Core Il assure le transport des invocations entre les objets. Cette couche utilise le protocole IIOP pour communiquer avec des objets sur des machines différentes. L’ORB est caché de l’utilisateur et seules quelques fonctions élémentaires sont accessibles.
    26. 26. @ Vincent Englebert - UNamur 26 Dynamic Skeleton Interface (DSI) Ce composant répond aux requêtes émanant des clients. Cette couche peut répondre à des requêtes sans que le skeleton statique ne soit disponible. Exemple - smalltalksmalltalk: ce langage peut créer de nouveaux types d’objets distribués dynamiquement - bridgebridge inter-ORB Static Skeleton Interface Chaque type d’objet sur le serveur peut avoir un skeleton (généré à partir de la description IDL) qui déballe les requêtes et emballe les résultats. ORB Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Dynamic Skeleton Dynamic Skeleton Static Skeleton Static Skeleton ORB APIORB API ServerServer • Object • Process • DBMS ServerServer • Object • Process • DBMS Object AdapterObject Adapter Object Adapter Interface Object Adapter Interface Object Adapter génération et interprétation des références d’objets invocation des méthodes sécurité des invocations dés/activation des objets enregistrement des objets
    27. 27. @ Vincent Englebert - UNamur 27 ORB Interface Repository Implementation Repository Interface Repository (IR) L’IR est un service qui fournit des objets persistants qui représentent l’information définie par les spécifications IDL et qui sont disponibles au moment de l’exécution. L’IR est utilisé par les compilateurs IDL pour effectuer du type checking, et par toutes les applications qui découvrent leur environnement au moment de l’exécution (Browser, administration, …) L’IR est standardisé par l’OMG. Implementation Repository Ce repository est spécifique à chaque constructeur d’ORB.
    28. 28. @ Vincent Englebert - UNamur 28 CORBA::ObjectCORBA::Object Tous les objets supportant une interface CORBA héritent implicitement de l’interface CORBA::Object qui est standardisée. interface ObjectObject { ImplementationDef get_implementation (); InterfaceDef get_interface (); boolean is_nil(); Object duplicate (); void release (); boolean is_a (in string logical_type_id); boolean non_existent(); boolean is_equivalent (in Object other_object); unsigned long hash(in unsigned long maximum); Status create_request (in Context ctx, in Identifier operation, in NVList arg_list, inout NamedValue result, out Request request, in Flags req_flags ); Policy get_policy(in PolicyType policy_type); DomainManagersList get_domain_managers(); };
    29. 29. @ Vincent Englebert - UNamur 29 Exemple Établir une plateforme de communication entre des courtiers en assurances et des compagnies d’assurance. Les courtiers peuvent disposer de matériels hétérogènes Les assurances peuvent disposer de serveurs différents Les assurances offrent des services communs mais peuvent aussi se différencier en offrant des services supplémentaires. BUS Corba Objets: compagnies d’assurance Objets: les courtiers Objets: les clients des compagnies
    30. 30. @ Vincent Englebert - UNamur 30 Stub compagnie Zurich ORB Dynamic Invocation Stub Assuré ORB API Courtier en assurances Dynamic Skeleton skeleton compagnie AXA ORB API AXA Assurance ServeurAXA Assurance Serveur Object Adapter ORB Stub compagnie AXA skeleton Assuré Exemple 1 Stub compagnie
    31. 31. @ Vincent Englebert - UNamur 31 Dynamic Skeleton skeleton Compagnie Zurich ORB API Zurich Assurance ServeurZurich Assurance Serveur Object Adapter skeleton Assuré ORB
    32. 32. @ Vincent Englebert - UNamur 32 module MediateurAssurance { typedef string<80> T_police; exception PasEnregistre { string motif; }; interface Assure { readonly attribute string nom; readonly attribute string prenom; readonly attribute string adresse; } interface Compagnie { readonly attribute string nom_compagnie; readonly attribute string adresse; Assure get_client(in string nom, in string prenom) raises PasEnregistre; float eval_prime(in short bonus_malus, in short puissance); void annule_contrat(in T_police num_police) raises PasEnregistre; } module AXA { interface CompagnieAssur : Compagnie { oneway void demande_nvelle_police ( in string nom; in string prenom; in string courtier; in string adresse_client ); }; }; module ZURICH { interface CompagnieAssur : Compagnie { boolean demande_nvelle_police ( in string nom; in string prenom; in string courtier; in string adresse_client; in short bonus_malus ); }; }; };
    33. 33. @ Vincent Englebert - UNamur 33 P «interface» ZURICH_compagnie demande_nvelle_police «interface» AXA_Compagnie «oneway» demande_nvelle_police «interface» Compagnie «readonly» nom «readonly» adresse get_client eval_prime annule_contrat
    34. 34. @ Vincent Englebert - UNamur 34 ORB ORBORB Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStubDIIDII StubStub ORB API ORB API ClientClient • Object • Process • DBMS ClientClient • Object • Process • DBMS Client IDLStub Client IDLStub Client IDLStubDSI Static Skel. ORB API ServerServer • Object • Process • DBMS OA Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStubDIIDII StubStub ORB API ORB API ClientClient • Object • Process • DBMS ClientClient • Object • Process • DBMS Client IDLStub Client IDLStub Client IDLStubDSI Static Skel. ORB API ServerServer • Object • Process • DBMS OA Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStubDIIDII StubStub ORB API ORB API ClientClient • Object • Process • DBMS ClientClient • Object • Process • DBMS Client IDLStub Client IDLStub Client IDLStubDSI Static Skel. ORB API ServerServer • Object • Process • DBMS OA ORB ORB Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStubDIIDII StubStub ORB API ORB API ClientClient • Object • Process • DBMS ClientClient • Object • Process • DBMS Client IDLStub Client IDLStub Client IDLStubDSI Static Skel. ORB API ServerServer • Object • Process • DBMS OA
    35. 35. @ Vincent Englebert - UNamur 35 Stub Compagnie Zurich Stub Compagnie Zurich Dynamic Invocation Dynamic Invocation Stub Assuré Stub Assuré ORB APIORB API Stub Compagnie AXA Stub Compagnie AXA Dynamic Skeleton Carte de Visite ORB API Object Adapter Agenda Exemple 2 ORB Application Courtier en assurances Application Courtier en assurances
    36. 36. @ Vincent Englebert - UNamur 36 Le Bus CORBALe Bus CORBA L’OMG définit les services rendus par le bus (ORB), paspas son implémentation. Cela permet des solutions à des problèmes spécifiques. Bus Processus Le client et les objets sont dans un espace d’adressage unique (i.e. processus). Temps de réponse minimal Interopérabilité → portabilité (langages, OS, constructeurs) Embedded systems: permet une meilleurs portabilité des composants sur des matériels très spécifiques. Bus Système d’exploitation La communication se fait entre processus sur une même machine. Hypothèses de simplification (format des données, erreur de transmission, …) Gnome/Orbit (slide suivant) Bus Serveur Les requêtes sont adressées à un (ou plusieurs) serveur(s) qui distribue(nt) les requêtes vers les objets distants. Gestion centralisée du BUS (écoute, auditing, …) Bus Réseau Implantation la plus courante. Orbix, Tao, Orbacus, eOrb, Mico, OpenOrb, Jacorb, Omniorb, jonathan, quelques dizaines de distribution …
    37. 37. @ Vincent Englebert - UNamur 37
    38. 38. @ Vincent Englebert - UNamur 38 local interface ORB { typedef string ObjectId; typedef sequence <ObjectId> ObjectIdList; string object_to_string (in Object obj ); Object string_to_object (in string str); // Dynamic Invocation related operations void create_list (in long count, out NVList new_list ); void create_operation_list (in OperationDef oper, out NVList new_list); void get_default_context (out Context ctx); void send_multiple_requests_oneway(in RequestSeq req); void send_multiple_requests_deferred(in RequestSeq req); boolean poll_next_response(); void get_next_response(out Request req); // Service information operations boolean get_service_information (in ServiceType service_type, out ServiceInformation service_information); ObjectIdList list_initial_services (); // Initial reference operation Object resolve_initial_references (in ObjectId identifier) raises (InvalidName); // Thread related operations boolean work_pending( ); void perform_work(); void run(); void shutdown(in boolean wait_for_completion); void destroy(); // Policy related operations Policy create_policy(in PolicyType type, in any val ) raises (PolicyError); };
    39. 39. @ Vincent Englebert - UNamur 39 Le protocole GIOPLe protocole GIOP L’OMG a défini un protocole générique réseau à usage général nommé GIOP. indépendance % des couches de transport sous-jacentes simplicité de son implémentation spécification générique faible coût de son utilisation (efficacité) GIOP définit: 1. Représentation commune des données (Common Data Representation) i.e. représentation physique des types IDL 2. Référence d’objets interopérables (IOR: Interoperable Object Reference) représentation standardisée des références d’objets distants 3. Pré-requis sur la couche de transport Exemple: les messages émis doivent être reçus dans le même ordre qu’à l’émission. 4. Format des messages Exemple: appel de méthode, exception, … GIOP peut être considéré comme un véhicule pour transporter des données qui ont été définies avec le CDR. GIOP définit huit types de véhicules (i.e. messages). GIOP ne définit pas l'IOR avec précision et délègue cette responsabilité aux protocoles concrets.
    40. 40. @ Vincent Englebert - UNamur 40 A. Le format CDRA. Le format CDR Ce format spécifie un format de données pour représenter tous les types élémentaires IDL sous la forme d’une suite d’octets transportables par les couches de communication. Alignement des bytes Ordre des bytes CDR ne fait pas d’encodage à la source, le récepteur effectue le décodage à la réception uniquement si son format de données internes est différent de celui de l’émetteur. Le nombre de conversions est donc réduit.
    41. 41. @ Vincent Englebert - UNamur 41 Exemple d’alignement Alignment of Data Items Developers who undertake the migration to the 64-bit operating environment will discover that a small set of issues tend to recur most frequently, on both Win64* and Linux* platforms. One of these is the alignment of data items – their location in memory in relation to addresses that are multiples of four, eight or 16 bytes. Under the 16-bit Intel architecture, data alignment had little effect on performance, and its use was entirely optional. Under IA-32, aligning data correctly can be an important optimization, although its use is still optional with a very few exceptions, where correct alignment is mandatory. The 64-bit environment, however, imposes more-stringent requirements on data items. Misaligned objects cause program exceptions. For an item to be aligned properly, it must fulfill the requirements imposed by 64-bit Intel architecture (discussed shortly), plus those of the linker used to build the application. The fundamental rule of data alignment is that the safest (and most widely supported) approach relies on what Intel terms "the natural boundaries." Those are the ones that occur when you round up the size of a data item to the next largest size of two, four, eight or 16 bytes. For example, a 10-byte float should be aligned on a 16-byte address, whereas 64-bit integers should be aligned to an eight-byte address. Because this is a 64-bit architecture, pointer sizes are all eight bytes wide, and so they too should align on eight-byte boundaries. It is recommended that all structures larger than 16 bytes align on 16-byte boundaries. In general, for the best performance, align data as follows: Align 8-bit data at any address Align 16-bit data to be contained within an aligned four-byte word Align 32-bit data so that its base address is a multiple of four Align 64-bit data so that its base address is a multiple of eight Align 80-bit data so that its base address is a multiple of sixteen Align 128-bit data so that its base address is a multiple of sixteen A 64-byte or greater data structure or array should be aligned so that its base address is a multiple of 64. Sorting data in decreasing size order is one heuristic for assisting with natural alignment. As long as 16-byte boundaries (and cache lines) are never crossed, natural alignment is not strictly necessary, although it is an easy way to enforce adherence to general alignment recommendations. Aligning data correctly within structures can cause data bloat (due to the padding necessary to place fields correctly), so where necessary and possible, it is useful to reorganize structures so that fields that require the widest alignment are first in the structure. More on solving this problem appears in the article, "Preparing Code for the IA-64 Architecture (Code Clean).« http://www.intel.com/cd/ids/developer/asmo-na/eng/170533.htm?prn=Y
    42. 42. @ Vincent Englebert - UNamur 42 Caractéristiques Les valeurs IDL ont une longueur déterminée par leur type dans le flux (size=1,2,4,8 bytes). Big-endian ou little-endian : pas de conversion Decimal(305 419 896) = big-endian(0x12 0x34 0x56 0x78) = little-endian(0x78 0x56 0x34 0x12) little-endian: Intel, big-endian: sparc, 68000 Les valeurs sont alignées sur des multiples de leur taille [boolean=True, long=132, short=56, char=‘Q’, long long=234.663 ] [0x01 0x00 0x00 0x00 0x84 0x00 0x38 0x51 0x00 0x00 0x00 0x00 0x00 0x03 0x94 0xA7] [0 :0 :0x01 0x20 0x20 0x20 4 :4 :0x00 0x00 0x00 0x84 8 :8 :0x00 0x38 10:10:0x51 0x20 0x20 0x20 0x20 0x20 16:16:0x00 0x00 0x00 0x00 0x00 0x03 0x94 0xA7]  Le récepteur doit connaître la nature des valeurs afin de les lire → typage statique  Question: Quels avantages pourrait-on avoir si le type de chaque donnée (et donnée agrégée) était véhiculé avec les données ?
    43. 43. @ Vincent Englebert - UNamur 44 B. Interoperable Object Request / IORB. Interoperable Object Request / IOR 1. Numéro de version du protocole transport utilisé sur le serveur 2. L'adresse du serveur resp. % au protocole spécifié ci-dessus 3. une suite d'octets identifiant l'objet sur le serveur
    44. 44. @ Vincent Englebert - UNamur 45 C. Hypothèses sur la couche transportC. Hypothèses sur la couche transport connection-oriented fiable ordre des paquets respecté pas d'erreurs dans les paquets pas de paquets perdus pas de paquets dupliqués la couche transport doit pouvoir être perçue comme une suite de bytes pas de limitation sur la taille du message transféré impose de transférer un message de GIOP à la couche transport en un bloc contigu en mémoire vive: exemple fichier vidéo de +Mb GIOP 1.1 permet de fragmenter des messages GIOP, la couche GIOP est donc capable de réassembler les sous-messages. La couche transport doit aviser la couche supérieure d’une perte de connexion l’entité distante ne répond pas → récupérer la connexion pour une autre entité (polling limité de connexions) Le mode opératoire est imposé (calqué sur le modèle TCP-IP).
    45. 45. @ Vincent Englebert - UNamur 46
    46. 46. @ Vincent Englebert - UNamur 47 D. Les messages GIOPD. Les messages GIOP Type de message Émetteur Tag Version de GIOP Request Client 0 1.0, 1.1, 1.2 Reply Serveur 1 1.0, 1.1, 1.2 CancelRequest Client 2 1.0, 1.1, 1.2 LocateRequest Client 3 1.0, 1.1, 1.2 LocateReply Server 4 1.0, 1.1, 1.2 CloseConnection Server 5 1.0, 1.1, 1.2 MessageError Client & Serveur 6 1.0, 1.1, 1.2 Fragment Client & Serveur 7 1.1, 1.2 Magic number GIOP Version Flags(endian;more) Tag Size 4 bytes 2 bytes 1 byte 1 byte 4 bytes Magic number: « GIOP » GIOP Version: exemple, version 1.2 Flags: 8 bits. Little/big endian; more=cfr. Fragment Ce message est suivi d’un autre message Tag: type du message Size: taille du message Message Header:
    47. 47. @ Vincent Englebert - UNamur 48
    48. 48. @ Vincent Englebert - UNamur 49 Request Ce message encode les invocations d’opération et les accesseurs. Le message est constitué de: IOR de l’objet distant nom de l’opération paramètres (in,inout) Reply Message envoyé par le serveur en réponse à une requête. Ce message contient les réponses à la requête (paramètres out et inout) ou l’exception si un problème est apparu lors de l’exécution de la requête. CancelRequest Message envoyé par un client à un serveur pour l’informer qu’il n’attend plus après sa réponse. LocateRequest Message « blanc » envoyé à un objet identifié par un IOR pour tester sa validité (~ping) LocateReply Message envoyé en réponse à un LocateReply par un serveur. (vrai ou faux) CloseConnection Le serveur informe un client qu’il ne répondra plus aux requêtes (en cours et à venir). Le client ne doit donc plus attendre après une réponse. MessageError Le récepteur n’a pas compris un message précédent (mauvais magic number, mauvaise version, erreur interne au bus, …). Fragment Message utilisé pour véhiculer des fragments d’un autre message trop important pour la couche transport. Si flag more=1, alors d'autres messages du type fragment vont suivre jusqu'à ce que flag more=0.
    49. 49. @ Vincent Englebert - UNamur 50 Request
    50. 50. @ Vincent Englebert - UNamur 51 Reply LOCATION_FORWARD. The server asks the client to send the request to another object. Its IOR is placed in the body of the message. LOCATION_FORWARD_PERM = deprecated NEEDS_ADDRESSING_MODE Ask the client to send the request again with another configuration (see reference manual)
    51. 51. @ Vincent Englebert - UNamur 52 Cancel & LocateRequest & LocateReply
    52. 52. @ Vincent Englebert - UNamur 53 Spécialisation de GIOP: IIOPSpécialisation de GIOP: IIOP GIOP TCP-IP IIOP ...OSIIPX IIOP: Internet Inter-ORB Protocol Mise en œuvre du protocole GIOP avec TCP-IP. Une distribution CORBA conforme doit offrir ce protocole. D’autres protocoles existent indépendamment de GIOP. Par exemple, pour l’architecture DCE, le protocole ESIOP définit un mapping des données IDL en termes du langage de définition de données défini par DCE. Néanmoins, une telle architecture doit supporter le passage de requêtes ORB2ORB. Référence IOR pour IIOP: numéro de version IIOP adresse IP de la machine (symbolique ou #. #. #. #) port sur lequel le serveur écoute identifiant de l’objet sur le serveur.
    53. 53. @ Vincent Englebert - UNamur 54 Interopérabilité entre Bus CORBAInteropérabilité entre Bus CORBA Motivations L’OMG définit l’interface du Bus plutôt que son implémentation. ≠ constructeurs peuvent faire des choix d’implémentations incompatibles. Protocoles différents ≠ niveaux de sécurité (secured sockets) Domaines : garantit la « non interopérabilité » accroître l’autonomie d’un système en l’isolant au sein d’un ORB distinct des autres finance / personnel / mécanique développement / test / production un même ORB ou des ORB de constructeurs différents Des passerelles sont néanmoins indispensables Néanmoins la plupart des Bus sont intéropérables entre eux.
    54. 54. @ Vincent Englebert - UNamur 55 Inter-ORB Bridge (Half-Bridge) même CPU (cfr. exemple) deux CPUs avec un protocole commun DSI DII DSI DII Half Bridge Half Bridge Inter-ORB protocols: GIOP & IIOP traduction des requêtes vers un format standard et commun I love you! Te quiero! Bridge
    55. 55. @ Vincent Englebert - UNamur 56 L’Adaptateur d’objets: POAL’Adaptateur d’objets: POA ORB Client IDLStub Client IDLStub Client IDLStub Client IDLStub Client IDLStub Dynamic Skeleton Dynamic Skeleton Static Skeleton Static Skeleton ORB APIORB API ServerServer • Object • Process • DBMS ServerServer • Object • Process • DBMS Object AdapterObject Adapter Object Adapter Interface Object Adapter Interface L’adaptateur d’objet est le mécanisme qui connecte une requête en utilisant la référence d’objet qui se trouve à l’intérieur de la requête avec le servant (processus,programme,thread, …) qui représente l’activité de l’objet référencé. Le servant est l’entité qui implante une interface décrite par le langage IDL. Des requêtes envoyées à des objets différents (IOR≠) peuvent être servies par un même servant.
    56. 56. @ Vincent Englebert - UNamur 57 Fichier IDL = Collection d’interfaces Fichier IDL IDL2xxx xxx=java, cpp, cobol, … fichier STUB dans le langage cible fichier STUB dans le langage cible fichier SKELETON dans le langage cible fichier STUB dans le langage cible fichier SKELETON dans le langage cible Application utilisatrice d’une interface Application hôte d’objets call MonServant « GenServant » isa iof « Proxy » fichier SKELETON dans le langage cible iof produces used by used by POA::Servant
    57. 57. @ Vincent Englebert - UNamur 58 RootPOA Default servant POA 1 Object id Object id Object id Object id Object id Object id Active Object Map Default servant Object id Object id Object id Object id Object id Object id Active Object Map POA 2 Object id Object id Active Object Map Default servant Policy Policy Policy ServantManager ServantManager POA Manager manages
    58. 58. @ Vincent Englebert - UNamur 59 Il existe un POA remarquable: « RootPOA » Un POA peut être le père de plusieurs POA Un POA est responsable de Servants Un POA associe des « object ID » à des Servants < « DEXIA » , new BanqueImplementation(« DEXIA », « BXL ») > < « Crédit Lyon. » , new BanqueImplementation(« LYON », « Paris ») > Un "objet distribué" est référencé sur le serveur par la séquence des POA Ids et l’Object ID. cette information se retrouve donc dans l’IOR ! Un POA peut posséder un ServantManager qu’il invoque lorsqu’il doit traiter une requête contenant un Object ID auquel aucun de ses Servants n’est associé. local Interface ServantManager { Servant incarnate (in ObjectId oid, in POA adapter); } Un contexte peut être associé à chaque POA qui influence son comportement: L’Object ID peut il être assigné automatiquement à un servant lors de son enregistrement dans le POA par le POA ou l'utilisateur doit-il donner explicitement l'object-id (exemple: primary-key d'une table SQL)? Un servant peut il posséder plusieurs Object ID ? Plusieurs Threads peuvent ils accéder au POA simultanément ? Les Objects Ids sont ils persistants ?
    59. 59. @ Vincent Englebert - UNamur 60 Default servant
    60. 60. @ Vincent Englebert - UNamur 61 CORBA fait une distinction entre « transient IOR » et « persistent IOR » (cfr. Lifespan policy du POA). Transient IOR: une référence IOR est valide tant que le servant de l'autre côté est actif. Dès que le servant est tué (panne, kill, …), l'IOR désigne un objet qui n'existe plus! L'exception OBJECT_NOT_EXIST est renvoyée au client. Un magic number est généré dans l'IOR de sorte que même si l'on redémarre le serveur, il y ait peu de chance que l'IOR désigne un nouveau servant qui n'a plus rien à voir avec celui qui a disparu. Persistent IOR la période de validité de cet IOR est indépendante de la période d'activité du servant « persistent » ne signifie pas que l'état de l'objet est persistant ! C'est au moment où l'on enregistre un objet auprès du POA que l'on précise la nature de la référence que le POA va construire.
    61. 61. @ Vincent Englebert - UNamur 62 Le gestionnaire de POAsLe gestionnaire de POAs Le POA Manager peut gérer simultanément plusieurs POA dont il contrôle l’état de traitement. Le gestionnaire de POA possède quatre états: Inactif Actif Suspendu Rejet Create_POA Discard_requests Hold_requestsactivate Discard_requests activate deactivate deactivate destroy Actif. Toutes les requêtes destinées à un POA lui sont transférées. Le POA les empilera et les traitera selon sa "policy". Inactif. État temporaire avant la destruction d’un POA. Les requêtes sont rejetées. Suspendu. Empile les requêtes dans une file d’attente du POA cible. Rejet. Toutes les requêtes sont rejetées en masse.
    62. 62. @ Vincent Englebert - UNamur 63@jacorb
    63. 63. @ Vincent Englebert - UNamur 64
    64. 64. @ Vincent Englebert - UNamur 65 Les servants sont créés à la volée et placés dans la table du POA. Ils pourront être désalloués par la suite (opération deactivate du POAManager par exemple)
    65. 65. @ Vincent Englebert - UNamur 66 Les servants sont créés à la volée mais à la seule fin d’exécuter une et une seule requête. preinvoke est appelé pour créer le servant, postinvoke est invoqué pour libérer le servant. La définition des ces deux opérations sont à charge du programmeur
    66. 66. @ Vincent Englebert - UNamur 67 Cette architecture permet de De gérer des objets persistants le ServantManager peut charger une donnée d’une BD et associer un nouveau servant. D’avoir des politiques différentes dans un même serveur persistant/éphémère single thread/multi thread transactionnel ou non ... Quelques cas d’utilisation: Activation explicite du servant pour chaque objet Un seul servant pour tous les objets. Tous les objets ont le même type exemple Ligne SQL module purement fonctionnel (i.e. sans état) Le même servant traite des requêtes destinées à des objets implémentant des interfaces différentes. Activation à la demande pour la durée d’exécution d’une méthode stateless object (fonctionnalité sans état, exemple: factorielle(n) )
    67. 67. @ Vincent Englebert - UNamur 68 Procédure de déploiementProcédure de déploiement module Business { interface Compte; interface Banque { Compte creer_compte(in string Nom); void ajout_interet(in Compte cpt); }; interface Compte { readonly attribute string Nom; attribute string Adresse; readonly attribute long Solde; void credit(in long somme); void debit(in long somme); }; }; Business.idl banque
    68. 68. @ Vincent Englebert - UNamur 69 import java.io.*; import Business.*; public class Serveur { private static void printReference(String reference){ try { FileOutputStream file=new FileOutputStream("ObjectId"); PrintStream pfile=new PrintStream(file); pfile.println(reference); file.close(); } catch (IOException ex){ System.out.println("Impossible de creer le fichier ObjectID"); } } public static void main (String args[]){ try { org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args,null); org.omg.CORBA.Object objetPOA=orb.resolve_initial_references("RootPOA"); org.omg.PortableServer.POA rootPOA=org.omg.PortableServer.POAHelper.narrow(objetPOA); BanqueImpl banque=new BanqueImpl(); byte[] objectId=rootPOA.activate_object(banque); org.omg.CORBA.Object obj=rootPOA.id_to_reference(objectId); String reference=orb.object_to_string(obj); printReference(reference); rootPOA.the_POAManager().activate(); System.out.println("Le serveur est pret..."); orb.run(); } catch (org.omg.CORBA.ORBPackage.InvalidName e){...} catch (org.omg.PortableServer.POAPackage.WrongPolicy e){...} catch (org.omg.PortableServer.POAPackage.ObjectNotActive e){...} catch (Exception e){...} } } Serveur.java
    69. 69. @ Vincent Englebert - UNamur 70 public class CompteImpl extends Business.ComptePOA { private String nom; private int solde; private String adresse; CompteImpl (String nom){ this.nom=nom; solde=0; adresse="<adresse inconnue>"; } // Nom read attribute public java.lang.String Nom () {return nom; } // Adresse read attribute public java.lang.String Adresse () {return adresse; } // Adresse write attribute public void Adresse( java.lang.String value ) { adresse=value; } // Solde read attribute public int Solde (){return solde; } // Operation credit public void credit (int somme) {solde=solde+somme; } // Operation debit public void debit (int somme) {solde=solde-somme; } } CompteImpl.java
    70. 70. @ Vincent Englebert - UNamur 71 // // Interface implementation definition : Banque // public class BanqueImpl extends Business.BanquePOA { private final static float taux= (float) 1.04; // Operation creer_compte public Business.Compte creer_compte (java.lang.String Nom) { try { CompteImpl cpt=new CompteImpl(Nom); byte[] id=_poa().activate_object(cpt); Object obj=_poa().id_to_reference(id); return Business.CompteHelper.narrow(obj); } catch (Exception e){ e.printStackTrace(); System.exit(0); } return null; } // Operation ajout_interet public void ajout_interet (Business.Compte cpt) { try { cpt.credit((int)(cpt.Solde()*taux-cpt.Solde())); } catch (Exception e){ e.printStackTrace(); System.exit(0); } } } défini par le mapping IDL-Java
    71. 71. @ Vincent Englebert - UNamur 72 // // Interface implementation definition : Banque // public class BanqueImpl extends Business.BanquePOA { private final static float taux= (float) 1.04; // Operation creer_compte public Business.Compte creer_compte (java.lang.String Nom) { try { CompteImpl cpt=new CompteImpl(Nom); byte[] id=_poa().activate_object(cpt); Object obj=_poa().id_to_reference(id); return Business.CompteHelper.narrow(obj); } catch (Exception e){ e.printStackTrace(); System.exit(0); } return null; } // Operation ajout_interet public void ajout_interet (Business.Compte cpt) { try { org.omg.PortableServer.Servant servant=_poa().reference_to_servant(cpt); CompteImpl compte=(CompteImpl)servant; compte.credit((int)(compte.Solde()*taux-compte.Solde())); } catch (Exception e){ e.printStackTrace(); System.exit(0); } } } BanqueImpl.java défini par le mapping IDL-Java optimisation, différence entre référence interopérable et objet local
    72. 72. @ Vincent Englebert - UNamur 73 import java.io.*; import Business.*; public class Client { /** Creates new Client */ public Client() { } private static String getReference(){ try { FileInputStream file=new FileInputStream("ObjectId"); InputStreamReader input=new InputStreamReader(file); BufferedReader reader=new BufferedReader(input); return reader.readLine(); } catch (IOException e){ e.printStackTrace(); } return ""; } public static void main (String args[]) { try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); String reference=getReference(); org.omg.CORBA.Object object=orb.string_to_object(reference); Business.Banque banque=Business.BanqueHelper.narrow(object); Business.Compte compte=banque.creer_compte("Englebert"); compte.credit(100); banque.ajout_interet(compte); System.out.println(compte.Solde()); } catch (Exception e){ e.printStackTrace(); } } } Client.java
    73. 73. @ Vincent Englebert - UNamur 74 Passage par valeur en Corba.Passage par valeur en Corba. Par défaut, les objets corba sont passés par adresse à l'exception des valeurs élémentaires (string, long, …). Néanmoins, il est possible de passer des « objets » par valeur depuis CORBA 3.0. Généralement, le passage des arguments est une caractéristique des paramètres des opérations. Exemple: C++: void f(Client c, Facture& f); Pascal: procedure f(c: Client; var f: Facture) En Corba, cette caractéristique est attachée au type et non à l'argument. Exemple: IDL: void f(Client c,FactureValue f) Les types qui sont passés par valeur sont des « valuetypevaluetype » (en lieu et place de « interfaceinterface »).
    74. 74. @ Vincent Englebert - UNamur 75 idl2java valuetype Bouchon { private long code; private Emetteur emetteur; public string route; public string heure; public string commentaire; void confirmer(in string commentaire); void dementir(in string commentaire); factory initialiser(in long code, in Emetteur emetteur, in string route, in string heure, in string commentaire); }; abstract class Bouchon { attributes & operations } interface CORBA.portable.StreamableValue interface BouchonValueFactory{ bouchon initialiser(…) interface CORBA.portable.ValueFactory implements extends
    75. 75. @ Vincent Englebert - UNamur 76 public interface ValueFactory { java.io.Serializable read_value(org.omg.CORBA.portable.InputStream stream); }; public class ValueFactoryExample implements org.omg.CORBA.portable.ValueFactory { /** * This function is used by the ORB to unmarshal a value type. * * We need to create a new value type and call the _read value of * this value type to unmarshal it. */ public java.io.Serializable read_value( org.omg.CORBA.portable.InputStream is ) { // 1. We create a new value type MessageValueImpl value = new MessageValueImpl(); // 2. Now, we unmarshal this value ((org.omg.CORBA_2_3.portable.InputStream)is).read_value( ( java.io.Serializable ) value ); // 3. Then, we return the unmarshalled value return value; } }
    76. 76. @ Vincent Englebert - UNamur 77 abstract class Bouchon { attributes & operations } interface CORBA.portable.StreamableValue interface BouchonValueFactory{ bouchon initialiser(…) interface CORBA.portable.ValueFactory implements extends class RtbfBouchon { // définition des opérations } class RtbfBouchonFactory { // définition de bouchon initialiser(…): bouchon initialiser(args … ){ … return new RtbfBouchon(…); } extends implements
    77. 77. @ Vincent Englebert - UNamur 78 interface Emetteur { void confirmer(in long code, in string commentaire); void dementir(in long code, in string commentaire); Bouchon get_info(); }; RtbfEmetteur emetteur_BXL RtbfBouchonFactory fabrique_SPA007 AdvCarSyst autoradio RtbfBouchon copy of n7 1. get_info() 2.initialiser(10,this, «N7»,«18:05»,« ») 3.new 4. return n7 5. confirmer(« 2H attente »)RtbfBouchon n7 6.confirm er(10,« 2H attente »)
    78. 78. @ Vincent Englebert - UNamur 79 Serveur Factory Client Factory x:avaluetype init requête x':avaluetype ORB t:repository Id(avaluetype); m:CDR(x) m ? quel est le factory de t x'
    79. 79. @ Vincent Englebert - UNamur 80 mode dynamique L'héritage est étendu aux value types et aux interfaces indifféremment: hérite de interface value type interface plusieurs non value type non 1 Un value type peut "supporter" une interface. le value type doit définir toutes les opérations spécifiées dans l'interface par un mécanisme de délégation, on peut mettre en œuvre un mode de passage par valeur et par adresse pour un même objet.
    80. 80. @ Vincent Englebert - UNamur 81 interface Exemple { void print(); } valuetype ExempleVal supports Exemple { void printLocal(); } interface ExempleVal extends Exemple class ExempleImpl implements Exemple { private Exemple clone; ExempleImpl(Exemple autre){ clone=autre; } public void print(){ clone.print(); } } interface Exemple idl2java idl2java class ExempleValImpl implements ExempleVal { public void print(){ System.out.println("Je suis içi"); } } implements extends implements les relations d'héritage et d'implémentation ontles relations d'héritage et d'implémentation ont été simplifiées pour des raisons d'ordreété simplifiées pour des raisons d'ordre pédagogiques et peuvent nepédagogiques et peuvent ne pas respecter les règles officielles de mapping.pas respecter les règles officielles de mapping. Lorsqu'un client demande un résultat, le serveur peut décider de le lui renvoyer par valeur ou par adresse selon le contexte.
    81. 81. @ Vincent Englebert - UNamur 82 interface ExempleVal extends Exemple class ExempleImpl implements Exemple { } interface Exemple class ExempleValImpl implements ExempleVal { } implements extends implements reference par valeurpar valeurpar valeurpar valeurpar valeur par référencepar référencepar référencepar référence
    82. 82. @ Vincent Englebert - UNamur 83 le passage par valeur permet de « délocaliser » des appels d'opération. Ainsi des appels (client-serveur) deviennent (client-client). Le passage par valeur implique que l'argument est à l'abri de toute modification qui serait opérée sur le site d’origine de l’objet. le passage par valeur/adresse est déterminé par le type des arguments et non par le mode des paramètres. les factories d'objets peuvent être distincts d'un hôte à un autre. Le passage par valeur permet de mettre en œuvre des politiques avancées de gestion comme: Transformation d'invocations (client-serveur) en invocation (client-client) avec post-synchronisation. diminution du nombre de requêtes distantes Permet d'améliorer l'indépendance d'un client vis-à-vis des objets distants en cas de faible QoS du réseau ou du serveur bornes touristiques hôtes mobiles communications orientées connexion (modem)
    83. 83. @ Vincent Englebert - UNamur 84 Le repository d'interfacesLe repository d'interfaces
    84. 84. @ Vincent Englebert - UNamur 85 CORBA::ObjectCORBA::Object Tous les objets supportant une interface CORBA héritent implicitement de l’interface CORBA::Object qui est standardisée. pseudo interface ObjectObject { ImplementationDef get_implementation (); InterfaceDef get_interface (); boolean is_nil(); Object duplicate (); void release (); boolean is_a (in string logical_type_id); boolean non_existent(); boolean is_equivalent (in Object other_object); unsigned long hash(in unsigned long maximum); Status create_request (in Context ctx, in Identifier operation, in NVList arg_list, inout NamedValue result, out Request request, in Flags req_flags ); Policy get_policy(in PolicyType policy_type); DomainManagersList get_domain_managers(); };
    85. 85. @ Vincent Englebert - UNamur 86 Le repository d'interfaces contient une description des interfaces, modules, … définis dans le système. Chaque fois qu'un nouveau type de composant est inséré dans le système, le repository d'interfaces doit être mis à jour afin de pouvoir le décrire. Il en est de même lorsque l'on met à jour la définition d'un composant. Exemple: interface Client { attribute string name; }; interface Client { attribute string name; attribute string address; }; chaque interface du repository est étiqueté d'un numéro de version « IDL:MediateurAssurance/AXA/AXA_compagnie:1.1 » (repository Id) Le repository d'interfaces contient une version de chaque interface. Des composants de « même type » peuvent donc coexister dans le système tout en ayant des versions d'interface différentes. Le système peut donc évoluer en douceur
    86. 86. @ Vincent Englebert - UNamur 87 interface Client { attribute string name; }; interface Client { attribute string name; attribute string address; }; ORB « IDL:.../AXA_compagnie:1.0 » « IDL:.../AXA_compagnie:1.1 »
    87. 87. @ Vincent Englebert - UNamur 88
    88. 88. @ Vincent Englebert - UNamur 89 Localisation d’Objets DistribuésLocalisation d’Objets Distribués Inventaire des objets distribués [QUOI/OÙ]: « répertoire ». Accroître la transparence de la localisation des différents composants. Le répertoire des objets distribués de CORBA est lui-même un objet distribué qui propose ses services à d’autres objets distribués. Afin de structurer et d’optimiser les accès au bottin, les objets sont arrangés en hiérarchie. DollarAndCo Banque Assurance Prêt Compte Courant Dépôt gestion gestion CalculInteret incendie vol
    89. 89. @ Vincent Englebert - UNamur 90 module CosNaming { typedef string Istring; struct NameComponent { Istring id; Istring kind; }; typedef sequence <NameComponent> Name; enum BindingType {nobject, ncontext}; struct Binding { Name binding_name; BindingType binding_type; }; typedef sequence <Binding> BindingList; interface BindingIterator; interface NamingContext { enum NotFoundReason { missing_node, not_context, not_object}; exception NotFound { NotFoundReason why; Name rest_of_name; }; exception CannotProceed { NamingContext cxt; Name rest_of_name; }; exception InvalidName{}; exception AlreadyBound {}; exception NotEmpty{}; void bind(in Name n, in Object obj) raises(NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind(in Name n, in Object obj)raises(NotFound, CannotProceed, InvalidName); void bind_context(in Name n, in NamingContext nc) raises(NotFound, CannotProceed, InvalidName, AlreadyBound); void rebind_context(in Name n, in NamingContext nc) raises(NotFound, CannotProceed, InvalidName); Object resolve (in Name n) raises(NotFound, CannotProceed, InvalidName); void unbind(in Name n) raises(NotFound, CannotProceed, InvalidName); NamingContext new_context(); NamingContext bind_new_context(in Name n) raises(NotFound, AlreadyBound, CannotProceed, InvalidName); void destroy( ) raises(NotEmpty); void list (in unsigned long how_many,out BindingList bl, out BindingIterator bi); }; interface BindingIterator { boolean next_one(out Binding b); boolean next_n(in unsigned long how_many, out BindingList bl); void destroy(); }; };
    90. 90. @ Vincent Englebert - UNamur 91 high availability ! stable  accès fréquents et cruciaux , mais les données peuvent être cachées
    91. 91. @ Vincent Englebert - UNamur 92 Techniques de résolution Résolution récursive (Corba Naming Service) Object resolve(in Name n) Contexte.resolve(<c1,c2,…,cn>)=(Contexte.resolve(<c1>)).resolve(<c2,…, cn>) void bind (in Name n, in Object id) Contexte.Bind(<c1,c2,…,cn>,object)=Contexte.resolve(<c1,…,cn-1>).bind(<cn>,object) Mais aussi rebind unbind list(…) @tanenbaum
    92. 92. @ Vincent Englebert - UNamur 93 Techniques de résolution Résolution itérative Object resolve(in Name n) Contexte.resolve(<c1,c2,…,cn>) NamingContext current=Contexte; for (string S in <c1,c2,…,cn-1>) do { current=current.resolve( S); } return current.resolve(cn) ; @tanenbaum
    93. 93. @ Vincent Englebert - UNamur 94 Comparaison Itérative  les serveurs sont moins chargés - (mais) plus de gestion sur le client le client doit posséder du code spécifique (librairie) pour itérer sur les serveurs - le client doit pouvoir accéder à plusieurs serveurs pas de problème sur un intranet avec des firewalls, il peut être difficile de joindre des serveurs que l'on découvre dynamiquement. - la seule façon de l'optimiser est d'installer un cache sur le client. Mais on a un cache pour chaque client - utiliser un serveur de nom proxy qui factorisera et cachera les requêtes - problème des incohérences: comment distinguer les noms stables et les noms instables - les communications se font toujours client ↔ serveur, a priori sur de longues distances. Récursive - la méthode récursive surcharge les serveurs un serveur est responsable de résoudre C1 il est aussi responsable de la résolution de <C2,…,CN> les serveurs dans la couche globale ne peuvent pas supporter la charge induite par la méthode récursive  le client ne discute qu'avec un seul serveur de noms  plus élégante la résolution incombe complètement au serveur de nom le serveur sert de façade à une complexité arbitraire  les messages échangés sont de proches en proches (on peut l'espérer) @tanenbaum
    94. 94. @ Vincent Englebert - UNamur 95 résolution récursive de <nl,vu,cs,ftp> avec caching et résultats étendus @tanenbaum information stockée dans le répertoire avant la mise en cache
    95. 95. @ Vincent Englebert - UNamur 96 Les répertoires fournis dans les packages ne sont généralement pas prévus pour gérer de grandes quantités d’information Répertorier les « grands » composants: oui répertorier les clients (i.e. dupont) d’une banque: certainement pas.  Un répertoire n’est pas conçu pour remplacer une base de données classique Les services d’un répertoire sont assez simples: possibilité d’implémenter son propre service de répertoire compatible avec l’interface CORBA au dessus de SQL par exemple. Le répertoire est un composant vital, colonne vertébrale du système : tolérant aux pannes persistant efficace Il est probable que les clients feront de nombreux accès au répertoire: rapprocher le répertoire des clients (même réseau, même machine) multiplier les répertoires par domaine (assurance,banque,gestion, …) Il est important de gérer l’information du répertoire conventions, guidelines, consensus, … sur les règles de nommage Le répertoire permet de délocaliser un composant: < banque.assurance, objet_namur >  < banque.assurance, objet_BXL > De par son rôle crucial, le répertoire est une donnée sensible sur le plan de la sécurité rien n’est prévu dans CORBA sur ce plan (cfr. service de sécurité) qui peut modifier, qui peut consulter, ...
    96. 96. @ Vincent Englebert - UNamur 97 L’ORB offre une opération pour obtenir le répertoire principal (root) module CORBA { interface ORB { […] typedef string ObjectId; typedef sequence <ObjectId> ObjectIdList; exception InvalidName{}; ObjectIdList list_initial_services(); Object resolve_initial_references( in ObjectId identifier) raises(InvalidName); }; }; Mais comment l’ORB peut-il connaître l’adresse du naming service ?
    97. 97. @ Vincent Englebert - UNamur 98 Référencer un IOR sous format textuel URL Corba: CORBALOC corbaloc://{[version du protocole @ ] nom de machine [ :numéro de port ]}/ clef de l'objet { } plusieurs fois ♦ [ ] optionel ♦ protocole par défaut: 1.0 ♦ port par défaut: 9999 Si plusieurs adresses, l'objet doit se trouver sur l'une des adresses (séparées par un ;) Exemple:corbaloc://iiop:1.2@fiatlux.info.UNamur.ac.be:4315/NameService IOR Représentation hexadécimale de l'IOR. IOR: suite de bytes IOR:000000000000001849444C3A427573696E6573732F42616E7175653A312E300000000001000000000000006C00 01020000000019666961746C75782E696E666F2E66756E64702E61632E626500000E4200000014004F4F0120B87FB7 E8000000504F41FEE27CF18A00000001000000010000002400000000100204E400000003000100010001000F000100 20000101090000000100010100 CORBANAME référence un objet par son entrée dans un Naming Service (indirection…) Exemple: corbaname:iiop:1.2@fiatlux.info.UNamur.ac.be:4315/universite.UNamur/GestionInscriptions Autres ftp: , http: , file: fichier où se trouve un IOR
    98. 98. @ Vincent Englebert - UNamur 99 Négociations de servicesNégociations de services Le concept de répertoire offre une description très statique et très simple du domaine applicatif. Le concept de trading permet de répondre à des questions plus complexes sur la localisation de composants distribués Principe Fournisseur Négociateur Demandeur Je peux imprimer Qui peut imprimer ? Imprime ! Naming=Pages Blanches; Trading=Pages jaunes
    99. 99. @ Vincent Englebert - UNamur 100 Un trader décrit un (des) objet en terme d’un ensemble de services qu’il peut rendre. Exemple: service impression { interface Imprimante; mandatory readonly property string Type; mandatory property boolean is_busy; readonly property boolean is_fast; property long quality; property long cost_per_page; }; Les services sont représentés par une interface que l’objet fournisseur supporte. Les services sont décrits par des attributs mandatory/optional Cette propriété n’est pas obligatoire pour décrire le service readonly or not Le fournisseur peut modifier a postériori la valeur de cette propriété. Le négociateur doit consulter le fournisseur chaque fois qu’il souhaite connaître la valeur de cette propriété Le demandeur interroge le négociateur afin d’obtenir la référence d’un fournisseur qui répond à sa demande.
    100. 100. @ Vincent Englebert - UNamur 101 interface ImprimanteMatricielle; Type=« matricielle »; is_busy=true; is_fast=true; quality=5; cost_per_page=1; interface ImprimanteHPCL Type=« InkJet »; is_busy=false; is_fast=false; quality=8; cost_per_page=3; impression Query: not is_busy and quality>=4 pref: min cost_per_page Hergé GregFranquin interface ImprimantePS Type=« PS »; is_busy=false; is_fast=true; quality=10; cost_per_page=1; [ Franquin, Greg ]
    101. 101. @ Vincent Englebert - UNamur 102 Fédération de tradersFédération de traders QUERY Local/if_no_local/always Local/if_no_local/always Les traders peuvent s’organiser en communauté pour répondre à une question. Le trader délègue la requête auprès d’autres traders et fusionne les résultats avant de les présenter au demandeur. Les liens sont orientés et seul le trader origine connaît le trader cible du lien. Problème de circularité dans l’émission de la requête: réponses multiples non-terminaison Configuration dynamique Configuration transitive Disposition optimale des traders efficacité par domaine proximité géographique département / thème couverture exhaustive des domaines par fédération
    102. 102. @ Vincent Englebert - UNamur 103 interface CosTrading::ImportAttributes +def_search_card:unsigned long +max_search_card:unsigned long +def_match_card:unsigned long +max_match_card:unsigned long +def_return_card:unsigned long +max_return_card:unsigned long +max_list:unsigned long +def_hop_count:unsigned long +max_hop_count:unsigned long +def_follow_policy:FollowOption +max_follow_policy:FollowOption enum CosTrading::FollowOption local_only: if_no_local: always: interface CosTrading::SupportAttributes +supports_modifiable_properties:boolean +supports_dynamic_properties:boolean +supports_proxy_offers:boolean +type_repos:TypeRepository exception CosTrading::PropertyTypeMism... type:ServiceTypeName prop:Property struct CosTrading::Property name:PropertyName value:PropertyValue interface CosTrading::Link +add_link:void +remove_link:void +describe_link:LinkInfo +list_links:LinkNameSeq +modify_link:void LinkInfo IllegalLinkName UnknownLinkName DuplicateLinkName DefaultFollowTooPermissive LimitingFollowTooPermissive interface CosTrading::Register +export:OfferId +withdraw:void +describe:OfferInfo +modify:void +withdraw_using_constraint:void +resolve:Register OfferInfo InvalidObjectRef UnknownPropertyName InterfaceTypeMismatch ProxyOfferId MandatoryProperty ReadonlyProperty NoMatchingOffers IllegalTraderName UnknownTraderName RegisterNotSupported interface CosTrading::Proxy +export_proxy:OfferId +withdraw_proxy:void +describe_proxy:ProxyInfo ProxyInfo IllegalRecipe NotProxyOfferId interface CosTrading::Lookup +query:void HowManyProps SpecifiedProps IllegalPreference IllegalPolicyName PolicyTypeMismatch InvalidPolicyValue interface CosTrading::LinkAttributes +max_link_follow_policy:FollowOption interface CosTrading::Admin +request_id_stem:OctetSeq +set_def_search_card:unsigned long +set_max_search_card:unsigned long +set_def_match_card:unsigned long +set_max_match_card:unsigned long +set_def_return_card:unsigned long +set_max_return_card:unsigned long +set_max_list:unsigned long +set_supports_modifiable_properties:boolean +set_supports_dynamic_properties:boolean +set_supports_proxy_offers:boolean +set_def_hop_count:unsigned long +set_max_hop_count:unsigned long +set_def_follow_policy:FollowOption +set_max_follow_policy:FollowOption +set_max_link_follow_policy:FollowOption +set_type_repos:TypeRepository +set_request_id_stem:OctetSeq +list_offers:void +list_proxies:void interface CosTrading::OfferIdIterator +max_left:unsigned long +next_n:boolean +destroy:void interface CosTrading::OfferIterator +max_left:unsigned long +next_n:boolean +destroy:void interface CosTradingDynamic::DynamicPropEval +evalDP:any interface CosTradingRepos::ServiceTypeRepository +incarnation:IncarnationNumber +add_type:IncarnationNumber +remove_type:void +list_types:ServiceTypeNameSeq +describe_type:TypeStruct +fully_describe_type:TypeStruct +mask_type:void +unmask_type:void PropertyMode PropStruct IncarnationNumber TypeStruct ListOption SpecifiedServiceTypes ServiceTypeExists InterfaceTypeMismatch HasSubTypes AlreadyMasked NotMasked ValueTypeRedefinition DuplicateServiceTypeName interface CosTrading::TraderComponents +lookup_if:Lookup +register_if:Register +link_if:Link +proxy_if:Proxy +admin_if:Admin
    103. 103. @ Vincent Englebert - UNamur 104
    104. 104. @ Vincent Englebert - UNamur 105
    105. 105. @ Vincent Englebert - UNamur 106
    106. 106. @ Vincent Englebert - UNamur 107 Questions Trouvez des applications qui pourraient bénéficier du support du trading service. Comparez ce service à la norme UDDI dans le domaine des web- services http://www.uddi.org
    107. 107. @ Vincent Englebert - UNamur 108 Gestion du cycle de vie (création)Gestion du cycle de vie (création) Dans un langage de programmation: customer=new Customer(« dupont »); Mais ces instructions retournent une référence ou une adresse spécifique à l’espace mémoire du client. Customer=create_Customer(123.32.56.12:2345, « dupont » ) transparence de la localisation ? Solution: expliciter le mécanisme de création par un objet dédié: la fabrique (factory)
    108. 108. @ Vincent Englebert - UNamur 109 Tentative 1 :Client c:Compte fc:FabriqueCompte:Naming Resolve(« FabriqueCompte » fc Create_compte(« dupont ») New Compte(« dupont ») c Il y a une fabrique par hôte La fabrique doit créer l’objet et l’enregistrer (POA, Naming, …) S’il y a plusieurs fabriques pour un même type d’objet, le client doit lui-même lever l’ambiguïté en faisant un choix de localisation.
    109. 109. @ Vincent Englebert - UNamur 110 Tentative 2 :Client c:Compte fc:FabriqueCompte:Naming resolve(« FactoryFinder » ff find_factory(« compte ») new Compte(« dupont ») ff:FactoryFinder fc create_compte(« dupont ») c
    110. 110. @ Vincent Englebert - UNamur 111 La localisation des objets nécessaires à la création d’objets distribués est maintenant cachée de l’entité cliente. La fabrique peut être configurée dynamiquement par les administrateurs :Client c:Compte fc1:FabriqueCompte fc2:FabriqueCompte find_factory(« compte ») new Compte... ff:FactoryFinder if condition then fc1 else fc2 create_compte(« dupont » c
    111. 111. @ Vincent Englebert - UNamur 112 Gestion du cycle de vie (destruction)Gestion du cycle de vie (destruction) Détruire un objet distribué signifie supprimer l’objet de l’espace d’adressage (comme un objet local) le désinscrire du POA maintenir les contraintes référentielles: registry/répertoire Trading services tout autre objet qui référencerait cet objet. Supprimer un type d’objet distribué T signifie supprimer les instances de T (cfr. ci-dessus) supprimer toutes les « fabriques » qui créent des objets de type T supprimer les types des fabriques concernées (si l’on peut) supprimer T du repository d’interfaces supprimer les informations sur T dans le repository d’implémentations.
    112. 112. @ Vincent Englebert - UNamur 113 Localisation des objets mobilesLocalisation des objets mobiles
    113. 113. @ Vincent Englebert - UNamur 114 Problème Soit C un composant qui peut migrer d'une machine à une autre. Identifier ce composant par une référence liée à la localisation physique du composant ne convient pas Exemple: Adresse IP et port ! Comment faire ? En plus d'être identifiant, la référence d'un composant devrait être stable dans le temps! L'IOR n'est donc pas un bon identifiant.
    114. 114. @ Vincent Englebert - UNamur 115 Application 1 Application 2 Solution 1. Chaîne de Proxy. proxy C Client + Le client conserve sa référence, transparence ok + Simple - la chaîne peut être longue si l'objet migre souvent  performance - chaque élément en plus est une cause d'échec supplémentaire
    115. 115. @ Vincent Englebert - UNamur 116 s s foo’: actif ortho: servants, suspendus foo’
    116. 116. @ Vincent Englebert - UNamur 117 Solution 2. Correction du client Corriger l'information du client Client BA FOO: foo REQUEST( IORfooA , …) REQUEST( IORfooB , …) IORfooA → IORfooB REQUEST( IORfooB , …) REQUEST( IORfooB , …) POA POA LOCATION_FORWARD( IORfooA → IORfooB ) en régime, les requêtes arrivent directement sur le composant si le composant se déplace souvent, la correction initiale de la référence peut prendre du temps
    117. 117. @ Vincent Englebert - UNamur 118 A a →B, b →B,c →B B a →E, b →E, c → E C D E a → I, b → I, c → J F G H I a → 1, b → 2 J c → 98 L MK b IP2: IP1: a IP98: c Solution 3. Mécanisme d'indirection distribué
    118. 118. @ Vincent Englebert - UNamur 119 A a →B, b →B,c →B B a →E, b →E, c → E C D E a → I, b → I, c → J F G H I a → 1, b → 2 J c → 98 L MK b IP2: IP1: a IP98: c IP200: c B a →E, b →E, c →F F c→K K c→200 1:insert(c,ip200) 2:insert(c,K) 3:insert(c,F) déplacé versdéplacé vers
    119. 119. @ Vincent Englebert - UNamur 120 A a →B, b →B,c →B B a →E, b →E, c → E C D E a → I, b → I, c → J F G H I a → 1, b → 2 J c → 98 L MK b IP2: IP1: a IP98: IP200: cc E a → I,b →I B a →E, b →E, c →F F c→K K c→200 J 4:nomore(c,ip98) 5:nomore(c,J) 6:nomore(c,E)
    120. 120. @ Vincent Englebert - UNamur 121 A a →B, b →B,c →B B a →E, b →E, c → E C D E a → I, b → I, c → J F G H I a → 1, b → 2 J c → 98 L MK b IP2: IP1: a IP98: c IP200: c B a →E, b →E, c →F F c→K K c→200 Quel est le problème ? Dans quelles circonstances, cette situation peut elle être tolérée?
    121. 121. @ Vincent Englebert - UNamur 122 Exercices Si pour un raison quelconque, l'ordinateur hébergeant un nœud de l'arbre doit être éteint, quelles sont les solutions envisageables si la durée d'indisponibilité est très courte si la durée d'indisponibilité est très longue Proposer une architecture en Corba permettant de mettre en œuvre ce principe définissez votre propre concept d'identifiant/adresse quels sont les types de composant dont vous aurez besoin écrivez le fichier IDL correspondant quelle architecture OO va-t-on mettre en place localement pour faire face ?
    122. 122. @ Vincent Englebert - UNamur 123 Limitations On doit en permanence parcourir l'arbre pour retrouver l'adresse d'une entité Introduire du caching. si le composant migre en dehors de son "super domaine" stable, il faut remettre tous les caches à jour Exercice: si l'on utilise les "transient IORs" de corba, doit on corriger les caches ? si non, quelle est l'efficacité de cette approche ? dans quels contextes cette stratégie peut-elle être efficace ? Scalabilité: La racine peut devenir un point névralgique du système Taille: Stocker les références de nombreux composants 1 Million de composants  1Ko = 1 Teraoctet = 10 disques de 100Giga Charge: de nombreux lookup et update ! organiser le nœud root en cluster ou sur un ordinateur plus puissant (parallèle) le problème de la charge du réseau persiste ! organiser le nœud en plusieurs sous nœuds répartis géographiquement.
    123. 123. @ Vincent Englebert - UNamur 124
    124. 124. @ Vincent Englebert - UNamur 125 Gestion des référencesGestion des références
    125. 125. @ Vincent Englebert - UNamur 126 Introduction À partir du moment où l'on peut référencer des entités distantes (IOR par exemple), à partir de quelles conditions peut on détruire une entité qui est potentiellement référencée ailleurs ? Hypothèses Un applicatif qui détient une référence sur un objet distant peut passer cette référence à d'autres applications et ainsi de suite. À tout moment, une application peut ne plus avoir besoin d'une référence. Un programme ne peut accéder un objet distant que si il détient une référence vers cet objet. Par facilité, ceci est aussi valable pour l'application qui héberge l'objet lui- même. Un objet qui n'est plus référencé de cette sorte est devenu inutile. Remarque: des objets peuvent être référencés et être pour autant inutiles: gestion des cycles: référenceréférenceréférenceréférence objet distribuéobjet distribuéobjet distribuéobjet distribué
    126. 126. @ Vincent Englebert - UNamur 127 La gestion des références avec des objets locaux Principe du Mark & Sweep 98.2928 'a' 123 toto 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 Magic NumberMagic NumberMagic NumberMagic Number Quel est l’intérêt du magic number par rapport à un drapeau booléen dans les objets ?
    127. 127. @ Vincent Englebert - UNamur 128 Comptage de référence Idée: le skeleton maintient un compteur avec le nombre de stubs dans le système distribué qui le référencent. Principe: Chaque stub demande au skeleton d'incrémenter le compteur le skeleton confirme l'incrément le stub peut être utilisé (idem pour une suppression de référence) Problèmes: si un hôte utilisateur tombe en panne, un objet ne pourra plus jamais être libéré. problème dans la synchronisation des messages problème de « race concurrence » entre incrément et décrément.
    128. 128. @ Vincent Englebert - UNamur 129 Problème de synchronisation Il faut détecter la perte de messages Il faut détecter la réplication de messages Pourquoi ne pas utiliser une communication synchrone tout simplement ? @tanenbaum2002
    129. 129. @ Vincent Englebert - UNamur 130 Problème de race concurrence Race concurrence P1 passe une référence à P2 P1 informe le skeleton de la suppression de son stub P2 tarde à informer le skeleton de cette nouvelle référence Correction se mettre dans les conditions d'une transaction P2 ne peut utiliser un stub que lorsque le skeleton a confirmé qu'il connaissait bien l'emplacement de cette nouvelle référence. Hypothèse supplémentaire ! la communication est fiable pas de perte messages ordonnés pas de duplication Inconvénients: L'objet O est concerné par trois messages suite à une "transaction" effectuée entre P1 et P2 a priori indépendante du "business" de l'objet O. problèmes de passage à l’échelle. @tanenbaum2002 +1
    130. 130. @ Vincent Englebert - UNamur 131 Technique Weight Watcher Un poids est assigné à chaque objet distribué Lorsqu'un stub est associé à un skeleton, on confie une partie du poids du skeleton au stub. @tanenbaum2002
    131. 131. @ Vincent Englebert - UNamur 132 Question Que se passe t il avec ce type de programme ? Soit X une référence vers O  exécuter X.opération envoyer X à P2 détruire la référence X attendre X de P2 goto  P1  attendre une référence Y exécuter Y.opération envoyer Y à P1 détruire la référence Y attendre Y de P1 goto P2
    132. 132. @ Vincent Englebert - UNamur 133 Amélioration du weight watcher avec des chaînes lorsque le poids local d'un stub devient 1, le processus ne peut plus engendrer de nouvelles références à partir de son stub régénérer un compteur en créant un skeleton frais qui jouera le rôle de proxy vis-à-vis des nouveaux demandeurs de référence vers l'objet. Inconvénients indirection supplémentaire fragilité de la chaîne longueur de la chaîne @tanenbaum2002
    133. 133. @ Vincent Englebert - UNamur 134 Gestion avec une liste des référents plutôt que maintenir un simple compteur, l'idée est de maintenir une liste des processus qui référencent l'objet distribué. Chaque object aura une liste L de processus qui le référencent Comme les opérations add et remove sont idempotentes, elle peuvent être répétées sans affecter l'état de l'objet. un processus peut donc invoquer ces opérations dans une boucle jusqu'à avoir un acknowledgment de l'objet. Lorsqu'un process P1 passe son stub à un autre process P2, P2 doit faire un add sur l'objet Problème de race concurrence ??? Si P1 parvient à faire un remove avant que P2 ne fasse un add, l'objet pourrait être détruit. utiliser le même principe que dans le comptage de référence ! Avantages ce protocole convient pour des infrastructures où le réseau n'est pas fiable: résistance aux pannes pas besoin de gérer la réplication possibilité de résister aux pannes des processus: le skeleton peut vérifier l'état des processus utilisateurs. Désavantages: la liste des références peut-être longue changer la sémantique: un processus n'obtient une référence que pour une certaine durée, au-delà le skeleton est autorisé à casser le lien à moins que le processus n'ait confirmé à nouveau sa détention d'une référence pour une nouvelle période. interface DistributedObject { void add(in Processus p); /* L := L union { p } */ void remove(in Processus p); /* L := L minus { p } */ }
    134. 134. @ Vincent Englebert - UNamur 135 Garbage collector distribué Gestion des références cycliques Le problème des références cycliques n'est pas géré par les mécanismes de comptage de références Idée: étendre le principe du Mark & Sweep au système distribué Difficulté: il faut stopper le système distribué dans un état valide durant l'exécution de l'algorithme! cette hypothèse n'est pas réaliste dans la plupart des cas !
    135. 135. FIN

    ×