\documentclass{article}

\usepackage[left=2cm,top=1cm,right=2cm]{geometry}

\usepackage[french]{babel}
\usepackage[latin1]{inputenc}

\title{Etat de l'art sur la reconfiguration dynamique dans les systèmes répartis : synthèse.}
\author{Guillaume Libersat}


\begin{document}

\bibliographystyle{abbrv}

\maketitle
\tableofcontents

\newpage

\section{Introduction et notions}

\subsection{Dynamisme et reconfiguration}

Les changements technologiques de ces dix dernières années ont
fortement impacté la manière dont les équipement informatiques sont
utilisés et communiquent.

En effet, on tend de plus en plus vers des réseaux distribués de
grande envergure où les noeuds sont à la fois très hétérogènes et
volatiles.

Qu'il s'agisse de fluctuation d'intervenants (panne, déplacement
constant, ...), de leurs ressources (qualité de communication,
puissance liée à l'énergie, etc) ou encore de leurs besoins fonctionnels
(nouveaux besoins au cours du temps, ...), on regroupe ces
spécificités sous le terme de \textit{dynamicité}.

Face à celà, le logiciel doit lui aussi devenir dynamique
dans le sens où il doit constamment s'adapter aux nouvelles
contraintes évoluants au cours de son exécution.

\subsection{Types d'intergiciels}

Les intergiciels peuvent exister sous plusieurs formes, voici les deux
plus répandues :

\begin{enumerate}
\item Courtiers à objets (\textit{synchrone}) : l'intergiciel joue le rôle d'un bus de
  communication (\textit{ORB}) par lequel les demandes/réponses des objets vont être
  acheminées ;
\item Intergiciels orientés messages (\textit{asynchrone}) : L'intergiciel va jouer le rôle
  de boîte au lettre et les applications pourront s'envoyer des
  messages.
\end{enumerate}

\subsection{Le projet INSIDE}

Le but du projet INSIDE est de concevoir et valider une plate-forme
technique pour des services internet utilisant des données
d'équipements de distribution électrique.

Cette architecture met en oeuvre différents types de matériels et est
impactée par tous les critères de dynamicité précédemment évoqués.

Comme il est impensable d'arrêter les applications au cours de leur
exécutions, il sera nécessaire d'utiliser les techniques de
reconfiguration dynamique pour les propriétés non fonctionnelles ainsi
que pour les protocoles de communication.

La suite du document s'intéresse donc aux solutions existantes dans le
domaine de la reconfiguration automatique pour les systèmes
distribués. Ces solutions mettent en oeuvre les composants et la
réflexivité afin de fournir les services attendus.

Nous ne nous intéresserons qu'aux solutions dédiées aux couches
``Intergiciel'' et ``Application''.

\section{Solutions au niveau ``Intergiciel''}

\subsection{Les intergiciels réflexifs}

\subsubsection{CompOSE$|$Q}

CompOSE$|$Q\footnote{CompOSE$|$Q pour \textit{Composable Open Software
  Environment with QoS}} est une implémentation Java de
\textit{TLAM}\footnote{\textit{TLAM} signifie \textit{Two Level Actor Machine}} et
permet la création d'applications réparties lorsqu'il y a des
exigences de \textit{QoS}\footnote{\textit{QoS} pour \textit{Quality
    of Service}}.

TLAM met en oeuvre des acteurs pouvant communiquer par messages et
pouvant réagir lors de la réception d'un message.
TLAM fournit un moyen sûr de composer tous les acteurs et ceci à
l'aide de trois services de bases connus et spécifiés qui peuvent
ensuite être étendus.

Ces trois services de base sont les suivants : (i) la \textbf{création
d'acteurs} à distance, (ii) la \textbf{capture d'état} distribuée (pour
connaître l'état des acteurs distants), (iii) l'\textbf{annuaire}, recensant
les acteurs. Ainsi, l'implémentation CompOSE$|$Q propose en standard des services
dérivés de ceux-ci comme la \textit{migration d'acteurs}, un
\textit{ordonnanceur} ou encore un \textit{service de nom}.

D'un point de vue du respect de la \textit{QoS}, celle-ci est réalisée
via la gestion de la répartition des agents et la gestion des requêtes
adressées aux agents.

Enfin, dans CompOSE$|$Q, la modification dynamique des protocoles de
communication entre les acteurs est réalisée à l'aide de
RCF\footnote{RCF signifie \textit{Reflective Communication
    Framework}.}. Ce framework permet de construire des protocoles (à
l'aide de composition de protocoles élémentaires) et de les utiliser
de manière sûre (en prévenant les conflits avec les autres protocoles
et services utilisés).

\paragraph{Critique}

On peut dire que la force de CompOSE$|$Q réside dans sa possibilité de
pouvoir préciser des contraintes entre éléments et de les faire
respecter.

Cependant, on aimerait par exemple disposer d'un mécanisme
d'assurance de compatibilité entre les protocoles et services ou
encore avoir la possibilité d'exprimer des contraintes distribuées. De
plus, le modèle de communication impose un cheminement des messages
assez long, ce qui peut être gênant pour l'utilisation de CompOSE$|$Q
en environnements à ressources limitées.

La dernière publication date de 2004
(http://www.ics.uci.edu/~dsm/compose/), ce qui indique que Compose$|$Q
n'est plus maintenu ni développé.

\subsubsection{QuO}

QuO est une spécification d'intergiciel permettant de créer des
applications réparties (à objets) ayant des exigences en terme de QoS.
Ces contraintes sont exprimées sur l'ensemble de l'application et des
éléments sont chargés de mesurer et d'adapter l'architecture afin de
fournir la QoS attendue.

L'implémentation la plus aboutie repose sur CORBA et constitue une
couche entre ce dernier et les applications utilisant l'ORB.
Cette couche est composée de trois types d'éléments :
\begin{enumerate}
\item Les \textbf{contrats}, permettant d'exprimer les niveaux de QoS
  attendus/fournis ainsi que l'ensemble des états possibles vis à vis
  de la QoS (et la manière dont il faut passer de l'un à l'autre) ;
\item Les \textbf{délégués}, agissant selon les contrats afin de
  prendre les décisions d'adaptation ;
\item Les \textbf{objets de condition du système}, fournissant une
  interface vers les ressources, les objets et l'ORB (observés par les
  contrats).
\end{enumerate}

A noter que QuO permet aussi de gérer finement des propriétés de la
QoS à travers des éléments spécialisés ou encore de créer et utiliser
des protocoles spécifiques non fournis par l'ORB.

En ce qui concerne la reconfiguration dynamique, QuO la gère soit
\textit{en ligne}, c'est à dire autour des invocations de méthodes, ou
\textit{hors ligne} à l'initiative des contrats et des objets de
condition.

\paragraph{Critique}

Un des points forts de QuO est qu'il fournit des langages pour définir
les contrats et délégués. On peut ainsi avoir une distinction claire
avec le code fonctionnel.

En revanche, QuO ne permet par exemple pas de modifier dynamiquement
les politiques d'adaptation ni de rajouter des fonctionnalités pendant
l'exécution. On n'obtient donc pas une vraie possibilité de
reconfiguration dynamique car il faut travailler avec les éléments
prédéfinis.

La dernière version de QuO
(http://qualityobjects.org/release/latest/index.html) date de
Septembre 2004. Cet intergiciel n'est plus maintenu.

\subsection{Les intergiciels à composants}

\subsubsection{Cactus}

Cactus est une technologie permettant la création d'intergiciels
fiables (grâce à une suite d'outils dédiés) 
et est particulièrement choisie pour la conception de protocoles
réseaux.

Elle n'est pas elle-même une solution permettant d'effectuer de la
reconfiguration dynamique, mais il existe des instances de celle-ci
qui le permettent.

Cactus est composé de modules qui sont eux-mêmes composés de
micro-protocoles. Ces derniers répondent à des événements à travers
des gestionnaires d'événements personnalisés.

Le système fonctionne alors en réagissant aux différents
événements. Cependant, les éléments peuvent aussi communiquer à
travers d'autres mécanismes comme les appels de méthodes.

Cactus s'occupe de vérifier que l'assemblage des composants est valide
en utilisant les relations de propriétés exportées par ces derniers
(conflit, dépendance, ...).


\paragraph{Critique}

On pourra remarquer que le modèle de composition de Cactus est plat
et imposé, ce qui est gênant pour la construction de systèmes
complexes (rendre le modèle récursif résoudrait ce problème).

De plus, il semblerait que les relations entre composants manquent
d'expressivité (pas de notion de temps, ...).

Enfin, selon le site internet, cactus n'a pas eu de mise à jour depuis
2002 (http://www.cs.arizona.edu/projects/cactus/).


\subsubsection{GORDA/Appia}

\textit{GORDA}(FIXME) est une spécification d'intergiciel ayant
pour but la réplication des bases de données. Son implémentation de
référence s'appelle \textit{Sequoia}(FIXME). Cette dernière utilise
Appia(FIXME), un framework pour les communication mettant en oeuvre la
reconfiguration dynamique pour arriver à son but.

Appia est organisé en couches et dispose d'une grande flexibilité. Son
but est la construction de protocoles de communication complexes et
distribués pour les applications. Il est implémenté en Java.

Appia met aussi l'accent sur le respect de la \textit{QoS} et fournit
des mécanismes de synchronisation entre différents canaux de
communication ainsi qu'en ensemble de services utilitaires
(chiffrement, détection d'erreurs, ...).

Pour réussir son pari, Appia utilise la composition et la
réutilisation de composants. Il utilise un design flexible et
modulaire, ce qui permet de reconfigurer les piles de protocoles
dynamiquement.

\paragraph{Critique}

Appia semble être la combinaison de plusieurs projets du domaine. Il
se base particulièrement sur l'expérience d'intergiciels (Cactus) et
de protocoles noyau (Ensemble, Coyote~\cite{bhatti98coyote}, ...)(FIXME!).

A l'heure actuelle, Appia est sorti en version 4.0 il y a un mois et
semble être activement maintenu (FIXME : http://appia.di.fc.ul.pt).

\subsubsection{Une infrastructure pour la modification dynamique d'algorithmes}

Cette infrastructure se découpe en trois couches, selon la répartition
habituelle (Système d'exploitation, Intergiciel et Application).
Il est possible de rendre adaptable chacune de ces couches et ainsi
permettre la modification des algorithmes à la volée et ce, sans
interruption de service.
Chacune des couches rendue adaptable sera alors décomposée en
composants adaptables (\textit{AC}) et un contrôleur d'adaptation sera
en charge de coordonner l'adaptation de ces derniers.

Ces \textit{AC} sont eux-mêmes composés de deux types de modules. Le
premier (appelé \textit{CAM}\footnote{CAM pour Component Adapator
  Module}) permet de choisir le meilleur algorithme (parmi ceux
disponibles) pour une fonctionnalité donnée tandis que le second
(appelé \textit{AAM}\footnote{AAM pour Adaptation-Aware Module})
permet de décrire les différents algorithmes éligibles.

Lorsqu'un changement de configuration intervient, il se déroule selon
ces trois phases :

\begin{enumerate}
\item \textbf{Détection du changement} : A la demande d'un composant, le
  \textit{CAM} évalue les besoins du moment et décide du besoin
  d'un changement d'\textit{AAM} ;
\item \textbf{Accord} : Les \textit{CAM} des différents sites trouvent alors un
  consensus sur le changement d'un \textit{AAM}. A la fin de cette
  phase, chaque \textit{CAM} connaît le remplacement qu'il doit effectuer
  (s'il y a lieu) ;
\item \textbf{Action d'adaptation} : Réalisée en trois étapes, cette phase
  permet le changement d'un \textit{AAM} de manière fluide (pas
  d'interruption, pas de perte de messages, ...) vers le nouvel
  \textit{AAM} élu à l'étape précédente.
\end{enumerate}

\paragraph{Critique}
Parmi ses points forts, on notera qu'elle propose une méthode intégrale
pour l'adaptation et qu'elle a été conçue de manière à permettre des
changements sans perte ni interruption, tout ceci de manière distribuée.

On remarquera pourtant que les travaux, à l'heure actuelle, ne se sont
concentrés que sur les \textit{AC}. La solution n'est donc pas encore
développée intégralement.
Enfin, il n'est ni possible de coordonner les \textit{AC} d'un même
site, ni d'avoir des politiques de choix dynamiques (elles sont figées
au niveau des \textit{CAM}), ni d'organiser les \textit{AC} de manière
hiérarchique (ce qui pose des problème pour le passage à l'échelle).

Pour finir, on notera que toute la dynamicité s'exprime uniquement sur
les algorithmes et non sur la structure et les fonctionnalités de
l'infrastructure.

FIXME: mAJ ?

\subsection{Les intergiciels réflexifs à composants}

\subsubsection{dynamicTAO}

DynamicTAO est un intergiciel écrit en C++ qui se base sur TAO, un ORB
faisant usage des composants et conçu pour les applications
temps réelles. TAO ne possède cependant pas de mécanisme de
reconfiguration dynamique.


DynamicTAO vient ajouter cette fonctionnalité manquante et permet donc
l'introspection et la reconfiguration de l'ORB et de ses objets
serveurs.

Afin de proposer ces mécanismes, dynamicTAO utilise des
\textit{configurateurs de composants} qui gèrent les dépendances entre
composants. Cette notion de dépendance est à la base du processus de
reconfiguration ; il en existe d'ailleurs deux types :

\begin{enumerate}
\item Les \textbf{pré-requis} : les dépendances sur des
  composants matériels et logiciels permanents ;
\item Les \textbf{dépendances dynamiques} : les dépendances sur des composants à un
  moment donné. Elles sont gérées par les \textit{configurateurs de
  composants} qui peuvent manipuler dynamiquement les listes de dépendances.
\end{enumerate}

Les \textit{configurateurs de composants} ont pour rôle primaire de
remplacer un composant de façon sûre. Le remplacement est effectué en
respectant deux propriétés (pas d'utilisation en cours du composant et
transfert de l'ancien vers le nouvel état).

En ce qui concerne l'architecture mise en oeuvre pour effectuer la
reconfiguration, dynamicTAO propose un service de reconfiguration
(``\textit{Dynamic service configurator}'') qui permet de piloter les
concepts offerts de plusieurs façons (comme depuis le réseau).
 
\paragraph{Critique}
Un des points forts de DynamicTAO est la séparation nette des
concepts. Ensuite, il garanti qu'une reconfiguration ne sera effectuée
que si les composants concernés ne sont plus utilisés.

En ce qui concerne ses limitations, on notera sa difficulté de
configuration (due à ses origines) et sa rigidité sur certains aspects
(par exemple, il faut déployer plusieurs instances de l'ORB si on veut
différentes configurations pour les servants). Afin de résoudre ces
problèmes, les auteurs ont développé LegORB, un
micro-ORB, mais ce dernier n'est malheureusement ni complet, ni
maintenu (FIXME: Vérifier!!).

Ensuite, son modèle de réflexivité ne s'oriente que sur l'aspect
structurel et il ne gère pas les dépendances inter-sites.

\subsubsection{OpenORB}

OpenORB est un intergiciel réflexif à composants qui a pour objectif
de fournir un canevas de construction pour intergiciels dynamiquement
reconfigurables (particulièrement dans le domaine des applications
multimédia et mobiles).


Les dernières versions d'OpenORB utilisent le modèle de composants
OpenCOM\footnote{Une extension allégée du modèle de composants COM de
  Microsoft}, qui a été développé avec la création d'intergiciels en
tête. Ce dernier permet de faciliter l'intégration des
méta-modèles avec des extensions dédiées (possibilité d'expliciter les
dépendances entre composants, possibilité d'insérer des intercepteurs,
ajout de mécanismes d'introspections et de mutex\footnote{Un verrou
  garantissant un accès exclusif sur une ressource.} sur les
composants). Ensuite, le modèle incite au regroupement des composants
d'un même domaine ce qui permet, entre autres, de faciliter la
composition de composants.

Une instance d'OpenORB est donc un assemblage de composants
OpenCOM qui peut être modifié en cours d'exécution.

Chaque composant possède un méta-espace qui est structuré en
méta-modèles et offre divers niveaux de réflexion :
\begin{itemize}
\item \textbf{Réflexion structurelle} : Elle fournit une
  représentation du contenu et de l'architecture du composant. Deux
  méta-modèles lui sont associés : (i) \textit{Interface}, donnant
  accès aux interfaces requises et fournies ; (ii)
  \textit{Architecture}, donnant accès aux interconnexions avec les
  autres composants ainsi qu'aux contraintes architecturales.
\item \textbf{Réflexion comportementale} : Cette réflexion permet de
  contrôler les activités du système. Deux méta-modèles la mettent en
  oeuvre : (i) \textit{Interception}, permettant l'ajout dynamique de
  traitements lors des interactions avec les composants ; (ii)
  \textit{Ressources}, permettant de contrôler et d'adapter selon les
  ressources.
\end{itemize}


\paragraph{Critique}

Concernant les défauts d'OpenORB, on notera l'impossibilité de créer
d'autres méta-modèles pour les composants ni de créer des composants
composites. Ensuite, la manière dont l'intergiciel doit être construit est
relativement lourde et peut être pénalisante dans des environnements
contraints.

Enfin, OpenORB ne garanti pas un maintien de l'intégrité du système
d'un point de vue distribué. Il faudrait pour cela adapter OpenCOM
afin de fournir les primitives nécessaires à la communication
inter-sites.

C'est pourquoi, les auteurs d'OpenORB travaillent actuellement(FIXME
http://www.comp.lancs.ac.uk/computing/research/mpg/reflection/ooimpl.php)
sur une nouvelle génération d'ORB qui utilisera OpenCOM2~\cite{coulson04component}.

Celle ci n'est plus basée sur DCOM et devient indépendante de la
plate-forme. De plus, le modèle est intrasèquement reconfigurable et
incorpore les méta-niveaux d'OpenORB2.

\subsubsection{FlexORB}

FlexORB~\cite{flexorb} est un ORB basé sur
Think~\cite{fassino02think}, une implémentation C du modèle de
composants Fractal~\cite{bruneton02recursive}.

Il s'agit d'une réponse aux besoins de mobilité et aux contraintes des
systèmes embarqués vis à vis des ORB. FlexORB dispose donc d'une
empreinte mémoire réduite (env. 120ko), on le classe dans la catégorie des
micro-ORB.


FlexORB est basé sur la plate-forme
\textit{NEVERMIND}, un environnement
d'exécution minimal utilisant la réflexivité à la compilation et
faisons usage d'un \textit{HAL}\footnote{\textit{HAL} pour
  \textit{Hardware Abstraction Level}}. 

C'est grâce à cette plate-forme que FlexORB peut fournir des services
évolués comme l'utilisation de code mobile, le déploiement des
composants ou la reconfiguration dynamique.

\paragraph{Critique}

FlexORB mise sa capacité d'adaptation et son efficacité sur sa
minimalité. Le pari semble être en partie rempli car FlexORB est
capable de s'exécuter sur de nombreuses plate-formes tout en
fournissant une vitesse d'exécution au moins aussi bonne que les ORB
traditionnels.

Cependant, FlexORB ne garanti pas l'intégrité du système lors du
déploiement et des reconfigurations. De plus, les outils fournis par
\textit{NEVERMIND} ne sont pas suffisants et un \textit{DSL}
permettant d'exprimer des règles de garantie d'intégrité et de
sécurité semble nécessaire.

FIXME : maintenance ?

\subsubsection{DREAM}

\textit{DREAM}\footnote{\textit{DREAM} pour \textit{Dynamic REflective
    Asynchronous Middleware}} est un canevas dédié à la création
d'intergiciels orientés messages (\textit{MOM}) dynamiquement
reconfigurables.

Tout d'abord, \textit{DREAM} est basé sur
Fractal~\cite{bruneton02recursive} et fournit un ensemble de
composants fonctionnels et non-fonctionnels (files, routeurs, ...).
Il étend aussi l'\textit{ADL} de Fractal afin de permettre la
reconfiguration structurelle et la reconfiguration
d'implémentation.

Enfin, \textit{DREAM} propose des outils permettant la vérification
(au niveau typage) des échanges ainsi que des outils pour la mise en
oeuvre des éléments développés (configuration, déploiement, ...).

\paragraph{Critique}

Ce canevas a pour avantage de définir les concepts de manière claire
et permet la construction d'intergiciels grâce à la composition
de composants qu'il fournit.
Il a aussi l'avantage de reposer sur un système de composants
flexible et de proposer des outils pour assister le développeur.

Enfin, \textit{DREAM} semble apporter une architecture qui permet de
maintenir une vitesse d'exécution comparable aux intergiciels
traditionnels tout en apportant un niveau de reconfiguration bien plus
élevé.

On pourra toute de même noter que \textit{DREAM} ne permet cependant
pas, à l'heure actuelle, de construire des intergiciels synchrones. De
plus, il serait intéressant que les outils de vérifications puissent
garantir les assemblages des composants.

En ce qui concerne la vivacité du projet, bien qu'il n'y ai pas eu de
release depuis 2005, le dépôt de \textit{DREAM} est actif, ce qui
signifie que le projet est maintenu.

\section{Solutions au niveau ``Application''}

\subsection{Langages de description d'architectures (ADL)}

\subsubsection{Polylith}

Polylith est un ADL qui permet de construire des applications en
assemblant des modules à l'aide d'un langage spécifique
(\textit{MIL}\footnote{\textit{MIL} pour \textit{Module
    Interconnection Language}}).


Il fournit un bus logiciel qui permet d'exécuter l'application
et de faire communiquer les composants. Les connecteurs sont
d'ailleurs automatiquement transcrits vers la forme la plus idéale
(appel de fonction, RPC, etc...).
Le bus fournit aussi des opérations simplifiant les reconfigurations :
création/destruction d'un module à distance, blocage des canaux de
communication, modification des interconnexions et migration de
modules.
A l'aide de ces opérations, il permet des changements de structure
ainsi que des changements de géométrie (migration inter-sites des
modules) pendant son exécution.


\paragraph{Critique}

Un des soucis de Polylith est qu'il a besoin de points de
sauvegarde/restauration qui doivent être déterminés par le
programmeur. Ceci a pour impact de restreindre la flexibilité des
reconfigurations et demande des efforts importants au programmeur.

Enfin, on pourra aussi noter que cet ADL ne permet pas la construction
de modules composites, ce qui peut poser des problèmes de passage à
l'échelle.

FIXME: maj ?

\subsubsection{Darwin}

Darwin fournit un langage permettant de décrire la configuration d'une
application. Un de ses avantages est qu'il permet de spécifier des
configurations complexes et paramétrables.

Darwin distingue deux types de composants : (i) les \textbf{composants primitifs}, contenant le code fonctionnel
  ; (ii) les \textbf{composants composites}, qui encapsulent d'autres
  composants et fournissent une hiérarchisation de l'application.

On notera que le langage permet de décrire des créations dynamiques de
composants (à l'aide d'opérateurs de conditions). La limitation est
qu'un composant ``statique'' ne pourra pas communiquer avec une
instance dynamiquement créée.

En ce qui concerne l'exécution, toutes ces descriptions sont
transformées vers des classes C++ et la communication est réalisée à
l'aide du support d'exécution Regis.

Les reconfigurations sont effectuées en suivant un algorithme mis en
oeuvre par un gestionnaire centralisé. Cet algorithme, pour schématiser,
détermine la liste des composants à geler/rendre passif ; déconnecte
et retire les élus ; crée le nouveau composant et reconnecte/réactive
le tout. Il permet particulièrement d'obtenir un état cohérent avant
d'effectuer des changements.

\paragraph{Critique}

Pour conclure, on remarquera tout de même que si Darwin permet de bâtir
des applications de manière hiérarchique, il a le défaut de n'utiliser
qu'un gestionnaire (ce qui peut poser problème pour le passage à
l'échelle). De plus, ce dernier n'incorpore pas la gestion des pannes.

Ensuite, l'algorithme utilisé a un coût de traitement assez élevé et
provoque une perturbation importante de l'application quand il est mis
en oeuvre.

FIXME: maj ?

\subsubsection{Spécification de la structure logique d'un système}

Il s'agit d'une méthode relativement récente qui propose d'ajouter la
notion de \textit{structure logique} à l'habituelle \textit{structure
technique} (la configuration des composants).
Cette \textit{structure logique} est en fait une description de
l'application d'un point de vue fonctionnel.

Cette méthode utilise la notion de \textit{service} pour ses
composants. Un \textit{service} est une entité sans structure définie
par un ensemble d'interfaces et spécifiant un comportement. Il peut
exprimer des dépendances sur d'autres \textit{services}.

L'utilisation de cette méthode permet des reconfigurations dynamiques
qui consistent à changer l'architecture technique en gardant les mêmes
fonctionnalités (donc la même \textit{structure logique}). Ce sont
d'ailleurs les seules autorisées.
Ces reconfigurations sont effectuées à l'aide de trois opérations :
(i) ajout/retrait de composants, (ii) ajout/retrait d'une liaison et
(iii) migration d'un composant.

\paragraph{Critique}

Cette méthode ne possède aucune implémentation à l'heure actuelle, ce
qui rend difficile la critique par manque de données.

\subsubsection{ADL permettant la vérification de la dynamique des architectures}

Rapide et Wright sont deux \textit{ADL} permettant d'utiliser la description de
l'application pour effectuer des vérifications formelles.

Rapide permet en particulier de simuler l'évolution des applications
et de vérifier des propriétés sur leur exécution. Avec Rapide, une
application est modélisée sous la forme d'un ensemble de composants
pouvant communiquer en manipulant des événements. La simulation est
alors une suite d'événements (appelés \textit{posets}).
En utilisant les relations et propriétés des \textit{posets}, Rapide
peut vérifier de manière formelle les contraintes spécifiées à l'aide
d'un langage dédié. De plus, un outil permet de vérifier que
l'implémentation associée est elle aussi valide.

Wright est un langage ayant le même objectif que Rapide. Il utilise un
calcul proche de \textit{CSP}\footnote{\textit{CSP} pour
  \textit{Communications Sequential Processes}}, qui décrit le
comportement d'une architecture logicielle à travers un modèle
algébrique de processus. En utilisant cette méthode, Wright permet de
vérifier des propriétés (comme l'absence d'interblocage).

\paragraph{Critique}

Bien que ces ADL ne permettent pas de déployer les applications
décrites, les fonctionnalités décrites pourraient être utilisées pour
modéliser et prévoir les changements lors des reconfigurations afin de
vérifier si elles sont valides.

On pourrait cependant exprimer une réserve sur ce modèle : le passage
à l'échelle n'est pas garanti.

\subsection{Utilisation des modèles de composants}

\subsubsection{DCUP/SOFA2}

\textit{DCUP}\footnote{\textit{DCUP} pour \textit{Dynamic Component
    UPdating}} est un modèle de composants récursif disposant d'une
architecture très spécifique et a pour but de permettre des
reconfigurations dynamiques. Il fait partie du projet \textit{SOFA}
(FIXME! http://sofa.objectweb.org/sofa1/index.html).

Une application \textit{DCUP} est une imbrication hiérarchique de
composants, qui sont eux-même composés d'un ensemble d'objets.

Un composant \textit{DCUP} peut être considéré sous plusieurs aspects
:
\begin{itemize}
\item L'aspect ``nature des opérations fournies''
  \begin{itemize}
  \item Partie \textit{fonctionelle} : elle contient des objets, des
    sous-composants et des wrappers ;
  \item Partie \textit{contrôle} : elle contient les outils permettant
    d'effectuer le remplacement des composants dans de bonnes
    conditions (construction/destruction, gestion des références,
    ...).
  \end{itemize}
\item L'aspect ``mise à jour dynamique''
  \begin{itemize}
  \item Partie \textit{permanente} : la partie statique des composants
    (exemple : wrappers) ;
  \item Partie \textit{remplaçable} : la partie composée d'objets
    versionnés.
  \end{itemize}
\end{itemize}

Une mise à jour d'un composant est effectuée selon la procédure
suivante : les gestionnaires des deux versions de composants
coopèrent et la mise à jour est ensuite obtenue auprès du fournisseur
de composants.
Une fois la nouvelle version disponible, les nouvelles classes
nécessaires sont téléchargées, l'ancien composant est détruit (et son
état est sauvegardé) et la nouvelle version est instanciée (et dispose
d'un accès à l'état sauvegardé).

\paragraph{Critique}

De part sa structure, \textit{DCUP} semble bien s'adapter au passage à
l'échelle. Cependant, on notera des points noirs comme le fait que des
parties pouvant remettre la cohérence du système en jeu doivent être
gérées par le développeur. Enfin, si l'on souhaite
reconfigurer une liaison, il est nécessaire de changer le composant
l'encapsulant (et donc tous ses sous-composants), ce qui peut être
coûteux s'il se situe en haut de la hiérarchie.

Depuis 2006, \textit{DCUP} a été remplacé son successeur,
\textit{SOFA2}~\cite{1158398}. Ce dernier est activement maintenu et
améliore l'architecture sous plusieurs aspects (FIXME: Développer!!).

\subsubsection{ScalAgent}

ScalAgent est une plate-forme destinée à la création d'applications
distribuées asynchrones. Elle fournit principalement trois éléments :
(i) un modèle de composants, (ii) une infrastructure d'exécution et
(iii) un ensemble d'outils (déploiement, description, ...).

Le modèle de composants (asynchrone et hiérarchique) décompose ces
derniers en deux parties : (i) la \textit{partie fonctionnelle}, contenant
les fonctions applications et (ii) le \textit{conteneur}, contenant les
éléments non fonctionnels (activation, déploiement, ...).

En ce qui concerne l'infrastructure d'exécution (basée sur
\textit{AAA}\footnote{\textit{AAA} pour \textit{Agent Anytime
    Anywhere}}), elle met en oeuvre des entités appelées ``agents''
qui réagissent aux événements. Ces agents évoluent dans un
\textit{serveur d'agents} qui instaurent les propriétés suivantes :
atomicité des réactions, persistance de l'état et ordonnancement
causal des événements.

D'un point de vue outils, ScalAgent fournit le nécessaire pour aider à la
construction et la gestion des applications. Ils sont basés sur l'\textit{ADL}
\textit{OLAN}\footnote{\textit{OLAN} pour \textit{FIXME!!}} et ont la
particularité de refléter la structure en arbre des applications.

\paragraph{Critique}

Cette plate-forme assure le passage à l'échelle de par sa
hiérarchisation mais ne permet cependant que de construire des
applications asynchrones. On notera aussi l'absence d'outils de
vérifications.

FIXME: maj?

\subsubsection{Fractal}

Fractal~\cite{bruneton02recursive} est un modèle de composant ouvert
et versatile qui se veut modulaire, extensible et indépendant des
langages de programmation.

Le modèle de composant de Fractal est hiérarchique (un composant peut
contenir d'autres composants) et réflexif. Il a aussi la particularité
de permettre le \textbf{partage d'instances} entre composants et de
n'imposer aucun modèle d'exécution.

Un composant Fractal est tout d'abord composé d'une membrane
(\textit{composite} ou \textit{primitive}) qui joue le rôle de
``conteneur''. Ensuite, le composant définit ses interfaces
fournies/requises ainsi que leurs connexions. Un composant dispose
aussi par défaut de plusieurs contrôleurs (s'occupant de l'aspect
non-fonctionnel) qu'il est possible de remplacer si besoin est.

\paragraph{Critique}

Fractal est un modèle de composants moderne regroupant la plupart des
expériences du domaine. On notera qu'il est indépendant des langages,
ce qui lui permet, entre autres, d'être présent à plusieurs niveaux
applicatifs. De part l'organisation de ses contrôleurs et son modèle
hiérarchique, Fractal semble pouvoir réussir aisément un passage à
l'échelle.

On notera cependant que la configuration des composants peut s'avérer
fastidieuse, même avec l'ADL proposé (utilisation d'XML). Cependant,
un certain nombre d'outils commencent à émerger, ce qui permettrait de
résoudre ce problème.

Enfin, Fractal dispose actuellement de plusieurs implémentations pour
divers langages et est activement maintenu et développé.

\subsubsection{OSGi}

\textit{OSGi}\footnote{\textit{OSGi} pour \textit{Open Services Gateway
    Initiative}}(FIXME: Ref) est une initiative industrielle qui a
pour but de produire les spécifications d'une plate-forme de services
basée sur Java.
Une partie centrale de cette plate-forme est le framework qui
implémente un modèle de composants dynamiques. Ces composants et leurs
ressources sont en fait contenus dans des archives \textit{JAR} et
sont appelés ``bundles''.

Les bundles déclarent un ensemble de services requis/fournis selon le
type de correspondant.
Ces bundles peuvent être installés, démarrés, arrêtés, mis à jour et
supprimés à distance sans besoin de redémarrage de l'application. Ces
derniers peuvent d'ailleurs écouter ces événements afin de s'adapter
si nécessaire.
Lors de leur insertion dans le système, les bundles doivent publier
une interface leur correspondant et peuvent adjoindre un ensemble de
propriétés.

Le framework offre aussi la possibilité intéressante de télécharger les
politiques d'adaptation à la volée.

\paragraph{Critique}

Le modèle de composants d'\textit{OSGi} a beaucoup évolué depuis les
dernières versions. Il semble bien s'adapter au passage à l'échelle
vis à vis de sa structure récursive et de la distribution des
services.

Cependant, on notera qu'\textit{OSGi} ne garanti pas l'intégrité du
système lors des remplacements de composants.

Enfin, \textit{OSGi} est activement maintenue et est dotée de
plusieurs implémentations actives.

\subsection{Technologies réflexives}

\subsubsection{DART}

DART fournit un canevas pour la construction d'applications C++
adaptables à objets. Ces dernières s'adaptent aux changements de
ressources dans leur environnement, et ceci grâce à l'utilisation de
la réflexivité.

DART permet de construire deux types de méthodes :
\begin{enumerate}
\item Les \textbf{méthodes adaptables} : elles permettent de fournir plusieurs
  implémentations d'une même méthode. Le choix de la méthode la mieux
  adaptée est réalisée par un \textit{sélecteur}.
\item Les \textbf{méthodes réflexives} : L'objet est associé à un méta-espace
  qui fournit des services. Ces derniers sont représentés par des pré et
  post-traitements au niveau des méthodes. Les services sont fournis
  par les \textit{réflecteurs}.
\end{enumerate}

En ce qui concerne la plate-forme, elle fournit un composant appelé
\textit{gestionnaire} qui est en charge des modifications précédemment
citées. Ces adaptations interviennent lors de la réception d'un
événement qui peut être généré soit par le \textit{gestionnaire} lui
même ou par d'autres objets. Les changements à effectuer sont régis
par les \textit{politiques d'adaptation} contenues dans le
\textit{gestionnaire}.


DART fournit aussi un compilateur qui permet d'automatiser certaines
tâches comme la génération des \textit{sélecteurs} et
\textit{réflecteurs} ou encore de modifier automatiquement les classes
pour leur permettre de communiquer avec les composants systèmes.


\paragraph{Critique}

En ce qui concerne ses limitations, DART ne permet pas de
modifier dynamiquement la structure de l'application et son
utilisation de la réflexivité à un grain fin peut poser des problèmes
de performance. De plus, DART impose au développeur de programmer des
parties non triviales (comme les \textit{politiques d'adaptation}).
Enfin, on notera qu'il aurait pu être intéressant d'avoir une version
distribuée de l'architecture car, pour le moment, la portée des
événements est limitée à un unique site.

FIXME: maj ??

\subsubsection{Ajout de réflexivité à la compilation en Java}

Il s'agit d'une méthode proposant d'ajouter de la réflexivité de manière
transparente aux applications Java. Le but est de réussir à adapter
les services non-fonctionnels (gestion de la distribution, ...) aux
conditions d'exécution.

Un \textit{moteur d'adaptation} prend les décisions de changements à
l'aide de l'observation des ressources physiques (grâce à un système de
représentation en arbre du matériel) et du comportement de
l'application, tout ceci en cohérence avec des \textit{politiques
  d'adaptation}. Ces dernières sont définies dans un fichier
de configuration qui précise l'ensemble des règles à suivre pour
déterminer les actions à mener selon les cas.

Le but des concepteurs est de n'imposer aucune des contraintes du
modèle de composants (pas d'interface, ...). L'application est
simplement compilée à l'aide d'un compilateur dédié qui modifie les
classes (en les encapsulant dans un conteneur).

Ce conteneur va avoir la fonction détourner les appels de méthodes et
les accès aux champs. Il est alors possible d'effectuer des
traitements autour des méthodes (\textit{adjonction de code non
  fonctionnel}) et d'introspecter l'application.

\paragraph{Critique}

En ce qui concerne les limitations de cette méthode, on notera que la
réflexivité est appliquée à un grain très fin, ce qui peut dégrader
considérablement les performances de l'application. Enfin,
l'approche est centralisée (le \textit{moteur d'adaptation} ne prend
en compte que les données locales), on aurait aimé voir une version
capable de s'adapter dans le cadre d'une application distribuée.


FIXME: maj ?

\subsection{Méthodes ad-hoc sur technologies existantes}

\subsubsection{Reconfiguration avec les EJB}

Cette méthode basée sur les \textit{EJB}\footnote{\textit{EJB} pour
  \textit{Enterprise Java Beans}} propose un mécanisme d'ajout
d'opérations de contrôle entre les invocations.
Ces opérations, appelées \textit{services}, interceptent les appels de
méthodes au niveau client et peuvent ainsi effectuer des traitements.

La création d'un \textit{service} se fait à l'aide d'un langage
(\textit{ISL}\footnote{\textit{ISL} pour \textit{Interaction
    Specification Language}}) qui modifie le pattern d'interaction
entre deux composants.
Il est aussi possible de fusionner des patterns afin d'exprimer des
besoins plus complexes. Le comportement résultant de la fusion reste
connu ce qui permet d'utiliser ces informations pour garantir des
propriétés (comme la compatibilité entre patterns).

\paragraph{Critique}

Cette solution est intéressante par le fait est qu'elle repose sur un
standard industriel et qu'elle permet de garantir des propriétés par
simple analyse des patterns.

Cependant, sa portée se limite aux interactions client-serveur et ses
capacités de reconfiguration sont limités (pas de reconfiguration au
niveau structurel, seul le côté client est modifiable, ...).

FIXME : Maintenance ?

\subsubsection{Reconfiguration avec CORBA}

Ce modèle, appelé \textit{DRS}\footnote{\textit{DRS} pour
  \textit{Dynamic Reconfiguration System}} permet d'ajouter de la
reconfiguration dynamique pour les applications utilisant l'ORB CORBA
en mode client/serveur.

Le modèle permet de remplacer les objets serveurs en garantissant des
propriétés d'intégrité (cohérence garantie, impact minimum,
transparence, ...).

Afin de garantir la cohérence des applications reconfigurées, \textit{DRS}
garantie (i) l'intégrité structurale (le nouvel objet sera toujours
compatible), (ii) la consistance mutuelle des états (le fait qu'il n'y aura
pas de rupture de communication lors d'un changement) (iii) le respect
des invariants de l'application.

Pour effectuer ces reconfigurations, \textit{DRS} met en oeuvre un
composant centrale appelé \textit{Reconfiguration Manager}. C'est à
travers lui que les reconfigurations vont être initiées. A l'aide
d'autres services, il va envoyer les ordres de gestion des objets sur
les différents sites. Ces services vont alors garantir que la
migration se passe comme souhaitée.

\paragraph{Critique}

\textit{DRS} présentent des caractéristiques intéressants comme le fait
que les reconfigurations soient transparentes pour le client. Ceci
facilite par ailleurs le développement des composants.

Cependant, cette méthode a l'inconvénient de ne pouvoir s'appliquer
qu'au modèle client/serveur. De plus, l'algorithme utilisé pour
garantir la cohérence de l'état du système lors d'un changement
entraîne une surcharge assez importante du système.

FIXME: maj


\newpage
\bibliography{intergiciels}

\end{document}

