Rapport d'étude sur la comparaison d'ORBS


Pierre Bittner
Dominique Debruyne
Loïc Grulois
Thierry Jilibert
Olivier Roland
Etudiants en DESS Génie Informatique
Promotion 1999 - 2000

SOMMAIRE

  1. Introduction

  2. Portabilé

  3. Performance

  4. Conclusion

  5. Les sources de notre benchmark

  6. Annexe


  1. Introduction
    1. Un rapide tour d'horizon.
    2. Les ORBs sont nés pour répondre aux soucis de faire communiquer entre eux des objets répartis.

      L'ORB se définit ainsi :
      L'ORB doit être un middleware entre les clients et les serveurs. Il gère les communications entre les clients et les serveurs de manière transparente pour le programmeur. Un souci d'interopérabilité doit être pris en compte, de sorte à faire communiquer entre eux des objets répartis sur des systèmes hétérogènes. Le développeur se contente de spécifier une interface, et n'a pas à connaître la technique de l'ORB.

      Les fonctions demandées à un ORB sont simples à comprendre :
      Définition d'une interface. Il est en effet important de savoir par quelles méthodes les objets pourront communiquer entre eux.
      Localisation et activation d'objets distants. Pour permettre un fonctionnement délocalisé, faisant inter agir différents systèmes.
      Assurer la communication entre les objets.

      Hormis certains produits hétéroclites, trois grandes familles de bus à objets répartis, qui répondent à ses critères, se démarquent. Il s'agit de :
      CORBA, défini par l'OMG.
      Component Object Model ( COM ), mis en place par Microsoft.
      Remote Method Invocation ( RMI ).
      Et d'autres qui ne sont pas compatibles ni avec CORBA, ni avec OLE.
      Nota :
      Nous allons par la suite limiter notre étude aux ORBs de la famille CORBA. Nous tenons à faire remarquer aux lecteurs que par la suite nous utiliserons le terme générique ORB pour désigner les ORBs de type CORBA

    3. CORBA.
    4. CORBA est la spécification d’une architecture standard pour les ORBs développée par l'OMG.

      CORBA est un mécanisme Middleware. Pour vulgariser, on pourrait dire qu'il s'agit d'une généralisation du Remote Procedure Call. Toutefois, CORBA ne s'arrête pas là et défini en plus nombre de services qui sont autant de facilités pour le développeur.

      CORBA a été conçu pour permettre a des composants intelligents (des objets) de se trouver sur le réseau et d'interopérer via un bus. La norme définie par l'OMG permet plus que la simple interoperabilité en définissant de nombreux services associés au bus qui permettent de créer et supprimer des objets, leur assigner un nom, les rendre persistants, externaliser leur état, définir des relations entre eux, traiter des transactions, etc..

      CORBA fournit donc, en plus du RPC simpliste, un IDL, un Langage de Description d'Interfaces. Il permet de spécifier de manière standardisée le comportement des objets présents sur le bus.
      Le support d'une grande variété de concepts orientés objets. CORBA Services et CORBA Facilities, des modifications apportées au RPC

      L'architecture CORBA 2.0 permet une interopérabilité entre objets quels que soient le langage de programmation, l'environnement d'exécution, le réseau de communication. Ainsi il est permis de faire communiquer entre eux des objets écrits dans des langages différents, pour des systèmes différents, d'une manière extrêmement simplifiée.

      Bien qu'elle spécifie beaucoup de points au niveau de l'IDL, de l'inter-opérabilité, la norme Corba est cependant suffisamment souple pour permettre de multiples implémentations différentes de bus répondants tous à cette norme.
      On trouve ainsi des ORBs spécifiques aux systèmes temps réel, des autres pour les systèmes embarqués, d'autres encore écris tout en Java, pour permettre une grande portabilité.
      Etudions un peu plus en détails les caractéristiques de chacun de ces ORBs.

      Les ORBs génériques :

      Ils implémentent plus ou moins rigoureusement la norme CORBA 2.X ou 3.0. Cette norme permet donc à des objets de communiquer de manière transparente pour le développeur, et elle définit le langage de définition d'interface supporté, les services qui doivent être implémentés, et une certaine inter-opérabilité entre les ORBs existants.
      Les composantes suivantes doivent être fournies par le bus CORBA :

      • ORB ( Object Request Broker )
      • SII ( Static Invocation Interface )
      • DII ( Dynamic Invocation Interface )
      • IFR ( interface Repository )
      • SSI ( Static Squeleton Interface )
      • DSI ( Dynamic Squeleton Interface )
      • OA (Object Adapter)
      • ImplR ( Implementation Repository )

      On peut citer les produits Orbacus, ou encore VisiBroker qui correspondent à cette définition.

      Les ORBs Temps Réels :

      Les ORBS temps réels fournissent en plus des ORBs classiques une interface standard qui permet aux applications de spécifier leurs besoins en ressources.
      Il est nécessaire pour ces applications souvent critiques de spécifier plusieurs paramètres qui sont :

      • priorité des threads,
      • files d'attente bufferisées,
      • niveaux de transport pour les connections,
      • signalisation réseaux,
      • notion de qualité de service.
      L’OMG a défini une spécification temps réel pour CORBA.

      TAO est un exemple d’ORB temps réel. Ces ORB ne sont pas très fréquents.

      Les ORBs embarqués :

      Les ORBs embarqués sont eux soumis à des contraintes fortes. Ils sont obligés de tenir compte des contraintes liées aux systèmes embarqués qui sont :

      • Le besoin pour les développeurs de contrôler finement la gestion des ressources système,
      • La nécessité de limiter l'implantation CORBA au minimum essentiel pour s'harmoniser avec l’architecture micro noyau,
      • La possibilité d'utiliser des protocoles de transport ésotérique, des formats de messages spécifiques
      CORBA n’a pas été spécifiquement conçu pour les systèmes embarqués.
      Ces contraintes n’ont donc pas été prises en compte dans les premières versions de la norme CORBA.
      L'OMG se penche sur ce problème et travaille actuellement sur une norme Systèmes Embarqués. Les principaux besoins sont d'épurer l'implémentation et de définir le strict minimum nécessaire pour garder les fonctionnalités des bus CORBA mais peut être en supprimant certains services ( service de nommage, etc...… ).

      On retrouve ici un produit d’Orbacus, et il existe par exemple une version de MICO pour les Palm Pilot.

      Les ORBs pur Java :

      Tout en répondant à la norme CORBA, ils sont écrits comme leur nom l'indique tout en Java. Ceci leur permet de fonctionner sur toute station supportant une machine virtuelle Java. Ils peuvent donc répondre à des besoins spécifiques en palliant à une forte disparité matérielle au sein de l’entreprise par exemple. On peut choisir d'utiliser un tel ORB pour ne pas imposer d'Operating System au client (navigateur).

      Quelques produits existants : DAIS, JacOrb, JavaOrb.

      Nous remarquons donc qu'il existe une réelle diversité de l'offre. Une fois que l'on a choisi le ou les type ( s ) d'ORB que l’on va utiliser, il reste donc à savoir quel sera le meilleur des ORBs pour vos besoins spécifiques.

    5. Critères de comparaison :

    6. Les ORBs proposent des services qui sont normalisés ( spécifiés par la norme Corba ).
      Pour comparer les ORBs sur la qualité des services fournis, il suffit de développer un programme de tests qui va utiliser chacune de ces fonctionnalités et nous fournir des résultats de performance. Il est aisé de pouvoir comparer ces services puisque justement ils sont normalisés, ce qui revient à dire que chaque ORB qui implémente ce service le fait de manière conforme à la norme, et que donc le même programme de tests pourra comparer les différents services.

      Par contre, les ORBs proposent aussi des services qui ne sont pas normalisés, ceci afin de les différencier des concurrents. Il en résulte que ces services spécifiques ne sont soit :

      • Pas implémentés sur deux ORBs différents à comparer, la comparaison devient alors impossible.
      • Implémentés mais de manières légèrement différentes, donc ces services ne font pas exactement la même chose.
      La comparaison doit alors se faire non plus sur les performances des services proposés, mais bien sur la présence ou non de services spécifiques qui peuvent répondre directement aux besoins de l'entreprise.
      Si une entreprise a besoin d'un ORB proposant des services qui ne sont pas normalisés par l'OMG, le choix des ORBs candidats se retrouve restreint et on choisira donc non pas le meilleur des ORBs mais l'ORB qui propose les services requis.

      Une dernière remarque concerne le fait qu'avant de pouvoir comparer les ORBs, il est nécessaire de pouvoir faire fonctionner le même programme de tests sur les ORBs à comparer. Attachons nous maintenant à l’étude de la portabilité des applications entre les différents ORBs existants.


  2. Portabilité
    1. Les ORBs évalués
    2. Le nombre d'ORBs sur le marché est gigantesque, Corba est en effet une des clés de l'évolution de l'informatique.

      Pour ne pas rater ce secteur critique du traitement de l'information, toutes les grandes sociétés, qu'elles soient du secteur informatique ou des télécommunications, ont un d'ORB qu'elles tentent d'imposer.
      L'évolution est donc très rapide mais certaines dérives apparaissent comme le non respect des interfaces définies par la norme Corba ou l'ajout de fonctionnalités qui n'ont pas encore été acceptées par l'OMG.

      Sur ce marché en constantes évolutions, on remarque également une présence importante de produits développés par des communauté de l'Internet. Ces offres ne sont malheureusement pas toujours proposé sous une licence reconnue par la Free Software Fondation.
      Pourquoi une telle présence?
      Le mouvement open source n'aurait jamais pu existé sans le réseau mondial et on pourrait presque dire réciproquement (Apache représente 50 % des serveurs Web). Il n'est alors pas étonnant de les voir participer à cette révolution dans le monde des communications que sont les objets répartis.

      Pour effectuer la comparaison d'ORBs nous avons tout d'abord du faire un tri et sélectionner des critères auxquels devaient répondre les candidats.

      • Les critères de sélections.
      • Ces critères sont établies à partir de raisons techniques et matériels.

        Sur le type des ORBs sélectionnés, nous avons porté notre choix sur les versions non-spécialisés (génériques dans le chapitre précédent). Ceci pour une simple et bonne raison, nous ne disposions pas des capacités techniques pour évalués des ORBs temps-réels ou embarqués.

        Ensuite pour des raisons matériels nous n'avons pu tester que les ORBs fonctionnant sur plate-forme Intel.

        Par contre nous ne nous sommes pas limités aux systèmes d'exploitation de Microsoft, Windows. Une grande partie des tests c'est déroulée sous Linux, un système ayant des capacités reconnues dans les applications communicantes.

        Nous avons également décidés d'évalués les ORBs qui ont pour langage cibles C++ incontournable mais également JAVA qui fait une percée remarquable dans les applications N-tiers. Le langage cible est le langage dans lequel est développé notre application. Il existe de nombreux autres langages comme le C, ADA ou smalltalk. Mais ceux-ci sont traités par des ORBs spécifiques. Le C++ et Java représente de toute manière la plus grande partie des langages utilisés dans la programmation objet.

        Notre sélection comporte des ORBs commerciaux mais aussi développé par des communautés.
        Nous n'avons testé que les ORBs commerciaux qui proposaient une version d'évaluation. Ces versions ne contiennent pas toujours l'ensemble des fonctionnalités du produit, mais sont suffisantes pour ne pas compromettre notre test.

        Voici la liste des ORBs qui ont été sélectionnés à partir des critères précédemment évoqués :

        • Visibroker (Inprise)
        • Orbacus (OOC)
        • OrbixWeb (IONA)
        • MICO
        • TAO
        • OAK
        • JavaORB
        • JacORB
        En comptant les versions Java / C++ et Windows / Linux, ce n'est pas moins de 12 ORBs que nous avons tenté d'évaluer.

      • Les critères de comparaisons.
      • Sur quels points avons nous testé ces ORBs.

        Premier critère et non des moindres, l'installation.

        • L'installation des ORBs
        • Pour diverses raisons, certains ORBs n'ont pu s'installer sur notre machine de test.

          Il ne s'agit pas uniquement des produits non-commerciaux tournant sous linux comme on pourrait se l'imaginer. On réussit souvent par diverses manouvres a obtenir un logiciel qui fonctionne grâce a la disponibilité des sources et des shells scripts d'installation.
          Après l'installation de Visibroker, Windows 2000 ne pouvait plus démarrer.
          Difficile alors de le tester sur ce système.
          Par contre aucun problème n'a été rencontré sous Windows 98. L'installation d'OrbixWeb a également échoué sous Windows 98. On ne disposait donc que d'un des principaux ORBs sous windows. Dommage.
          Sous Linux, on ne disposait pas de la convivialité des programmes d'installations de Windows, mais le taux de réussite est quand même plus important. Seul TAO et OAK n'ont pu être installés.

          Voici la liste des ORBs qui ont passé la phase d'installation.
          Installation signifie que l'ensemble des programmes de tests et de démos fonctionné.
          Pour chaque ORB, nous indiquons le système d'exploitation et le langage cible:

          Nom OS Langage
          Visibroker 3.2 Windows JAVA
          Visibroker 3.4 Linux JAVA
          JacORB Linux JAVA
          JavaORB Linux JAVA
          Orbacus 3.2.1 Linux JAVA
          Orbacus 3.2.1 Linux C++
          Orbacus 4 Linux C++
          MICO Linux C++
          OmniORB 2.8 Linux C++

          Tous ces ORBs ont été installés avec les options par défaut.

          Voila donc 9 ORBs sur lesquels nous avons pu tester la portabilité du code et dans le chapitre suivant la performance.

        • Documentations, configurations.
        • Ceux sont des critères relativement importants lorsque l'on souhaite utiliser de manière intensive un ORB.

          C'est le point le plus satisfaisant sur l'ensemble de l'offre. Chaque ORB permet une configuration suffisante pour la plupart des utilisations.
          La documentation souvent non terminée est quand même largement suffisante pour leur installation et leur utilisation. L'ordonnancement des chapitres est parfois troublant (JavaORB). La documentation des produits commerciaux n'est pas la plus fournie.

          Pas de critique particulière sur ce point.
          Ni de bon point à attribuer d'ailleurs.

        • Les fonctionnalités testées.
        • Notre but premier été de vérifier qu'un programme utilisant CORBA pouvait être porté sur ces ORBs.

          Nous avons décidé de porter une application minimaliste de type Hello Word sur ces ORBs. Un client fait l'appel d'une fonction d'un objet géré par un serveur.
          Le client et le serveur doivent utiliser si possible le POA comme Adaptateurs d'objets et le NameService pour récupérer l'objet.

          L'adaptateurs d'objets et le CosNaming sont les outils minimums que doivent fournir les ORBs.

          On remarqua rapidement que même une application aussi simple ne pouvait se recompiler et s'exécuter rapidement sur n'importe quel ORB. Nous avons donc tenté de fournir un programme le plus facilement adaptable.
          Un Makefile générique est également fourni.

          Dans les 2 parties qui suivent, nous allons voir la mise en oeuvre effectue pour notre applications sur les ORBs C++ puis JAVA.
          Une description des ORBs est également effectuée.

    3. Les ORBS C++
      • Quelques ORB C++
        1. VisiBroker
        2. Edité par Inprise, VisiBroker se veut orienté vers le e-commerce.

          Ce produit existe en 3 déclinaisons : Visibroker pour java, Visibroker pour C++ et Visibroker pour Delphi, et existe pour différentes plateformes (Windows, Solaris, HP-UX, AIX, IRIX, Digital Unix, Linux, OS390).

          La version 4 supporte la norme CORBA 2.3 et inclu désormais les fonctionnalités suivantes :

          • Portable Object Adapters (POA)
          • Objects by Value (OBV)
          • RMI sur IIOP
          • Clustering et équilibrage de charge

          Visibroker n'est chez Inprise qu'un élément d'une vaste gamme, ou les produits phares sont J/C++Builder et Delphi.

          Plusieurs versions sont téléchargeables sur Internet, dont des versions pour Linux et Windows. L'installation est aisée sur ces deux plateformes. Sous linux, elle requiert un shell compatible Korn Shell, et est guidée par un script interactif.

          Sous Windows, Visibroker est fourni sous la forme d'une archive compressée. L'installation se passe sans problèmes sous Windows 95, mais a planté Windows 2000.

          Contrairement à l'installation, l'utilisation de Visibroker ne nous est pas apparu simple.

        3. Orbix
        4. Le produit Orbix 3 est édité par la société Iona et est disponible sur une vaste gamme de plateformes :

          • Microsoft (Windows 95/NT)
          • Unix (Solaris, HP-UX, AIX, Digital Unix, IRIX, SCO, ...)
          • OS temps réel (VxWorks)
          • Mainframe (OS/390)

          Orbix s'intègre dans une gamme de produit restreinte et orienté Middleware avec notamment OrbixCOMet (intégration CORBA-COM) et Wonderwall (firewall IIOP).

        5. Orbacus
        6. Produit par la société Object Oriented Concept., Orbacus bénéficie d'une approche ouverte :

          • Disponibilité du code source
          • Open Communication Interface
          • Modularité (pour les systèmes embarqués)

          Exemples et documentation en font un produit simple à utiliser. L'installation à partir du code source s'est déroulé sans problème.

        7. Mico
        8. MICO = Mico is Corba

          Mico est un projet OpenSource de l'université de Francfort, placé sous licence GNU, dont l'intention est de produire une implantation de CORBA respectant au plus près la norme de l'OMG et disponible gratuitement.

          Le projet est guidé par 5 principes :

          • Mico est écrit en C++
          • Il ne repose sur aucun code tiers
          • Ne fait usage que d'outils largement disponibles et non propriétaire
          • Se concentre sur la norme et n'implante pas de bricolages propriétaires
          • Effort de structuration afin de faciliter l'extension

          La version 2.3.1 de Mico supporte les BOA, POA, DII, DSI, ainsi que de nombreux services CORBA :

          • Naming Service
          • Trading Service
          • Event Service
          • Relationship Service
          • Property Service
          • Time Service

          Mico est utilisable sur la plupart des systèmes UNIX (Linux, Solaris, AIX ...) ainsi que sur Windows NT. Il inclu un navigateur graphique d' « interface repository » écrit en Java.

          Un projet visant à produire un ORB complètement multi-threadé est poursuivi parallèlement à Mico sous le nom de Mico-mt. Ce projet devrait être intégré à Mico lorsque un seuil de stabilité aura été atteint.

          Mico-mt est disponible en version alpha, mais de larges parties boguées le rendent difficilement utilisable.

        9. TAO
        10. TAO est une implantation temps-réel de CORBA utilisant ACE, conçu à l'université de Washington par Douglas Schmidt.
          ACE (Adaptative Communication Environment) est un ensemble de wrappers et de frameworks, permettant de réaliser les tâches de communication des logiciels sur une grande variété de plateformes.
          ACE fournit des composants pour la gestion événementielle, l'initialisation de services, la communication interprocessus, la gestion de mémoire partagée, .. etc
          Il est disponible en version C++ et Java.
          Nous ne sommes pas parvenus à compiler Tao. Les ressources nécessaires sont importantes, et nous avons abandonné après 7 heures de compilation sur un K6-350.

        11. ILU
        12. ILU est le projet Inter Language Unification de Xerox.
          Les interfaces objets proposées par ILU masquent les différences entre les langages, espaces d'adressages et systèmes d'exploitation. L'interopérabilité dans ILU peut être obtenu via RPC, HTTP, XNS Courier ou CORBA.
          Le projet Gnome a envisagé d'utiliser ILU comme middleware afin de gérer l'hétérogénéité et la répartition, mais aucun accord sur la licence n'a pu être obtenu avec Xerox.

        13. Orbit
        14. Orbit est un ORB écrit en C, destiné au projet Gnome. Orbit inclu un service de nommage et un début de service événement.
          Il ne supporte pour l'instant que le langage C, mais l'ouverture vers les autres langages est un des buts du projet.

      • Exemple d'un portage
      • Notre but ici est d'experimenter un portage d'une application simple d'un ORB vers un autre afin d'entrevoir les différents problèmes que cela pose.
        Nous allons pour cela nous donner un IDL et son implantation avec Mico, et voir les différentes étapes nécessaires pour porter le programme sous omniORB.

        Soit l'IDL suivant :

        interface Hello
        {
          string hello();
        };

        L'implantation de cet IDL a la structure suivante :
        Les fichiers hello_i.hh et hello_i.cc déclare et définisse respectivement la classe Hello_i, servant de l'interface Hello.
        Le fichier client.cc défini une fonction appelant la méthode hello après avoir trouvé le serveur.
        Le fichier hello_srv.cc est la fonction principale du serveur.

        La fonction hello ne fait rien d'intéressant : elle retourne une chaîne de caractères :

        char * Hello_i::hello()
        {
          char *rep = CORBA::string_dup("Hello World !");
          return(rep);
        }

        Nous disposons pour cet IDL d'une implantation réalisée avec Mico.
        Nous avons la classe Hello_i a été déclaré dans le fichier hello_i.hh, et défini dans hello_i.cc.
        La documentation de Mico nous indique que notre classe doit hériter de la classe Hello_skel produite par le compilateur IDL.

        Notre implantation de Hello est donc la suivante.

        Il reste à définir un client et un serveur pour notre objet Hello_i.
        Le client agit selon le scénario classique :
        initialisation du bus
        récupération d'une référence sur le serveur
        appel de fonctions sur le serveur

        Avec Mico, cela donne le code suivant.

        Le serveur, quant à lui, initialise l'ORB et le BOA avant d'instancier un servant pour l'interface Hello.

        Nous remarquons que dans l'implantation de Hello_i et dans le client nous incluons le fichier hello.h. Ce fichier est généré par le compilateur IDL de Mico. C'est là notre première modification de portage : les compilateurs IDL des différents produits ne produisent pas les mêmes fichiers, ni les mêmes classes d'ailleurs.

        Afin de faire tourner notre application avec omniORB, il faut inclure le fichier hello.hh et faire hériter Hello_i de la classe _sk_Hello.
        La déclaration de Hello_i devient alors la suivante :

        class Hello_i : public virtual _sk_Hello
        {
        public:
          Hello_i();
          virtual ~Hello_i();
         virtual char * hello();
        };

        Le deuxième lot de différences est constitué par les signatures différentes des fonctions d'initialisation.
        La fonction boa->impl_is_ready(), par exemple, n'accepte pas le même nombre de paramètres sous Mico et sous OmniORB.
        Celle de Mico prend un seul argument, CORBA::ImplementationDef::_nil(), alors qu'omniORB accepte un second argument : celui-ci sert à spécifier si l'appel doit être bloquant ou pas.
        Avec Mico, la fonction orb->run() permet d'entrer dans la boucle de traitement.
        Avec omniORB, il suffit de passer 0 en second paramètre de impl_is_ready. Cela permet d'entrer dans la boucle de gestion de l'ORB.

        Nous avons du apporter une autre modification à notre code source pour pouvoir le compiler avec omniORB.
        Ce dernier, pour une raison que nous ne somme pas parvenu à determiner, ne supporte pas l'instruction cerr << e << endl;.
        Il nous a fallu la remplacer par quelquechose comme cerr << ``Exception levée'' << endl; pour pouvoir compiler.

        La troisième catégorie de différences est celle liée à la compilation.
        Nous avons vu que les fichiers générés par le compilateur IDL n'étaient pas les mêmes.
        Les bibliothèques requises, comme on peut s'en douter, ne sont pas non plus les mêmes.

        Voici deux exemples de Makefile pour notre petite application Hello, le premier pour Mico et le second pour OmniORB.

        Pour OmniORB, on change les chemins, les binaires et les options de compilation.

        En examinant ces scripts, on remarque plusieurs détails différenciant Mico et OmniORB, comme par exemple le fait que Mico utilise des wrappers à la place des compilateurs et linkers du système, ou que OmniORB définisse des variables particulières.

    4. Les ORBs Java
      • Présentation des ORBs
      • Comme ORBs Java, nous avons évalué Visibroker, Orbacus, JavaORB et JacORB.
        VisiBroker et Orbacus ont déjà été présentés avec les ORBs C++.
        Leurs caractéristiques ne différent pas. Juste une petite remarque sur Orbacus JAVA. L'archive ne fournit pas l'outil qui permet de transformer le fichier IDL en code JAVA. Celui ci est fournit sur leur serveur ftp ou il faut également récupérer l'archive pour le C++ et le recompiler.

        • JacORB
        • JacORB est un ORB écrit en JAVA - is an object request broker written in Java - il implémente la version standard CORBA 2.0. JacORB est un logiciel OpenSource, facile à installer et à utiliser. La version la plus récente date du 11 Février 2000 (Version 1.0 Béta 15).

          Caractéristiques de JacORB

          • fully multithreaded ORB
          • IDL compiler, supports OMG IDL/Java language mapping rev. 2.3
          • IIOP
          • POA (Portable Object Adapter)
          • POAMonitor, a GUI tools that lets you inspect your object adapters
          • Dynamic Invocation Interface (DII) and Dynamic Skeleton Interface (DSI)
          • Dynamic Management of Anys (DynAny)

        • JavaORB
        • JavaORB est concu par le Distributed Object Group
          Ce groupe a été fondé en avril 1999 pour fournir des environnements et des outils sur les technologies objets distribués.
          Ce groupe réuni actuellement 350 membres et 100 partenaires.

      • Le JDK 1.2
      • Nous utilisons pour ce test le JDK 1.2. Celui de Blackdown sous Linux et celui de SUN sous Windows.

        Le JDK 1.2 fournit les paquetages CORBA de l'OMG.
        Ces paquetages entrent en conflit avec ceux des ORBs. Il existe deux méthodes pour contourner ce problème.
        Le plus couramment utilisé est celui de fournir des programmes (souvent des shells scripts) redéfinissant les outils du JDK que sont java et javac.
        Par exemple JavaORB utilise jaco et Visibroker vbj ou vbjc.
        Le problème de cette méthode est que l'utilisateur utilise instinctivement les commandes java*. Un temps d'adaptation est donc nécessaire.
        Ce n'est évidemment pas un problème pour les adeptes du Makefile.
        Une autre solution utilisée par JavaORB est l'utilisation d'un fichier orb.properties placé dans le répertoire jre du jdk.
        Ce fichier redéfinie les classes de l'OMG.
        L'utilisateur peut donc utiliser de manière transparente les commandes java*.
        Seul petit problème, que ce passe t’il si 2 ORBs utilisent la même technique ?
        Sur les 4 ORBs Java, JavaORB était le seul a utilisé cette méthode.

      • L'implémentations
        • Le Makefile
        • Pour minimiser les différences d'utilisations des ORBs, nous avons développé un Makefile générique.

          Ce Makefile inclu un fichier Makefile.bench dans lequel on redéfini les exécutables en fonctions de L'ORB.
          La sélection de l'ORB se fait en retirant le commentaire de l'ORB qu'on utilise.
          Dans l'exemple précédent JacORB.

          Maintenant regardons de plus prés le fichier Makefile.bench.

          En fonction de l'ORB, nous générons les outils de compilations et d'exécution.
          On génère automatiquement un paquetage bench.
          L'exécution du NameService, du client et du serveur peut se faire automatiquement à partir du Makefile.

          Par exemple pour JacORB dans trois console différentes :
          make ns # Lance le NameService
          make serveur # Lance le serveur
          make client # Lance le client

          Seul Visibroker échappe à cette règle car la mise en oeuvre du NameService est plus compliqué. Nous verrons cela un peu plus tard.

        • Le source
        • Que la compilation et la mise en oeuvre diffère selon les ORBs cela peut paraître normale.

          Il n'en va pas de même pour le code.

          Malheureusement en Java, nous n'avons pas à notre disposition de pré-processeurs comme en C++ qui nous permettent de définir des macros.
          Une solutions peut éventuellement venir de la séparation des classes utilisant CORBA et celles contenant l'algorithmique mais cela n'est pas très pratiques dans un programme comme le notres mais est tout à fait envisageable pour des apllications de plus grandes envergures.
          Dans notre cas, j'ai utilisé le même source code dans lequel je mettais en commentaire les parties ne concernant pas l'ORB.

          On peut donc voir à partir du fichier les différences d'utilisations.

          Fichiers BenchServer.java

          Remarquez à quelle point les interfaces sont proches.

          Cela ne varie qu'en fonction des paramètres ou des paquetages utilisés.
          Il est dommage que les concepteurs ne fassent pas plus d'effort pour tenter de respecter les normes établies par l'OMG.
          Les interfaces de JavaORB et JacORB sont ceux qui respectent le plus la norme.
          Nous pouvons à présent regarder le code du client.

          A part pour VisiBroker et les propriétés de Orbacus peut de différence.  Evidemment le code est très simple et met en oeuvre peut de fonctionnalité.

          Voila pour le code de l'applications, maintenant nous allons parler des processus a utilisé pour faire fonctionner le NameService sur les ORBs.

        • Le NameService
        • Pour utiliser le NameService de chaque ORB, il est nécessaire de lancer des programmes.
          Une nouvelle fois Visibroker se met en évidence par le nombre de service a lancer pour une application aussi simple :

          Visibroker

          Pour utiliser Visibroker, il faut lancer le programme osagent.
          Puis pour chaque objet que l'on met dans le NameService, il faut en lancer un nouveau.

          Le NameService même :
          vbj -DORBservices=CosNaming \
          com.visigenic.vbroker.services.CosNaming.ExtFactory \
          NameService ns_log

          Puis l'objet bench :
          vbj -DORBservices=CosNaming -DSVCnameroot=NameService \
          com.visigenic.vbroker.services.CosNaming.ExtFactory \
          bench bench_log

          Les autres ORBs utilisent tous la même méthodes

          Orbacus Java :
          $(JAVA) $(JAVA_FLAGS) com.ooc.CosNaming.Server -i -OAport 10000 > ${HOME}/nameserv.ref

          JavaORB :
          $(JAVA) $(JAVA_FLAGS) JavaORB.INS.Server -OAPort=2001

          JacORB :
          ns ${HOME}/NS_Ref ${HOME}/nsdb

          Les fichiers en paramètres sont tous des fichiers de log.

          Nous en avons terminé avec les ORBs Java. Tous ont pu être utilisés avec le CosNaming.

    5. conclusion
    6. En conclusion, le portage d'une application d'un ORB vers un autre necessite des modifications que nous répartissons en trois catégories :
      Les modifications du code source incluent les noms des classes à dériver, les fonctions de signatures différentes à adapter...
      La cuisine de Makefile, qui est abordable et détaillé dans les documentations.

      Les imprévus.
      Nous avons porté ce même programme sur divers ORBs, et à chaque fois nous avons rencontrés ces 3 types de problèmes. Par exemple, l'imprévu avec Orbacus a été qu'il interdit de définir la fonction hello dans l'interface hello. En renommant la fonction en say_hello(), le reste du portage s'est bien déroulé.
      Porter une application d'un ORB sur un autre est aisé, à condition bien sur que l'on n'utilise que des services disponibles sur l'ORB cible. En effet, les services disponibles sont trés variables d'un ORB à l'autre.

      Notons cependant que ces problèmes ne se posent lors de l'utilisation des services de CORBA.
      Une fois l'objet récupéré, l'invocation des méthodes se fait de manière complétement transparente pour le développeur.
      Le code lié aux ORBs peuvent être déporté dans des classes séparés. Seules ces classes ont besoin d'être modifié lors d'un port vers un autre ORB.
      Cela ne représente finalement qu'une infime partie de l'application finale (5%) et bien peut de contraintes par rapport à tous les avantages que nous apportent CORBA.


  3. ORBs & Benchmarking.
    1. La rapidité : le dernier critère.
    2. Le critère de la rapidité ne peut pas être le principal critère de choix d’un ORB.

      Ce critère n’intervient que quand tous les autres critères ont été satisfaits. Que faire d’un ORB très rapide mais qui ne serait pas stable ? Il revient donc a chacun, en fonction de ces besoins, de sélectionner parmi les ORBs sur le marché ceux qui conviennent le mieux en terme de stabilité, de respect des spécifications de l’OMG, de service, de licence et de prix. Ce n'est qu'en dernier lieu, et pour départager les ORBs ainsi sélectionnés que l’on envisagera de les comparer en terme de vitesse. Aussi, le critère de la rapidité aussi important soit il ne peut être que le dernier critère à prendre en compte.

    3. Les problèmes pour évaluer la performance d’un ORB.
    4. Comme toutes les technologie qui utilise les réseaux informatiques, les ORBs sont assez difficiles à évaluer en terme de performance. Le résultat d’un test ne sera jamais qu’un résultat obtenu sur une machine particulière, sur un réseau particulier et surtout à un instant donné. De surcroît les résultats obtenus n’auront de valeur que pour le test qui a été fait, rien ne dit à priori que les ORBs se comporteraient de la même manière sur un tout autre test.

      L’un des principal problème auquel nous avons à faire face et la charge du réseau. Si cette dernière et constante dans le temps, nous pouvons considérer que les ORBs sont testés dans des conditions équitables. Si toutefois le réseau par sa lenteur constitue un goulot d’étranglement, les résultats risquent d’être nivelés par la performance du réseau lui même ! Plus pénible encore est le cas du réseau à charge hautement variable, or c’est précisément le cas de notre réseau en salle de TP. Pour une raison encore mal définie (le HUB est probablement le principal responsable) la charge de notre réseau est très variable d’un ¼ heure sur l’autre avec une tendance certaine à la saturation. La solution à moins d’avoir à disposition un réseau libre dédié aux tests est bien entendu de travailler en local sur une machine via localhost.

      Un autre problème auquel nous sommes confrontés est un problème qui se pose pour tout bench, à savoir que les autres processus qui tournent sur la machine de test ont tendance à faire varier (certes faiblement) les résultats. Ainsi, comme on le verra ci après, il est difficile de mettre en évidence certains phénomènes dont on parle notamment dans le CORBA comparaison project et qu’on évoquera ci-après.

      N’oublions pas et ce sera la conclusion de ce chapitre, que la solution qui consiste à passer par localhost pour éviter les interférences dues au réseau et quand même un peu réductrice et masque un certains nombres de mécanismes complexes. Ainsi par exemple, il se peut que le temps d’invocation d’une méthode via localhost soit supérieur au temps d’invocation en passant par le réseau. C’est le cas notamment quand on passe un tableau d’anys (Cf CORBA comparaison project).

    5. Un bench minimaliste.
    6. Après un certains nombre d’essais, nous avons finalement réduit notre procédure de test à sa plus simple expression. Le contrat IDL suivant est suffisant pour mettre en évidence un certain nombre de phénomènes.

      struct Structure {
        short b1;
        short b2;
      };
      interface Bench {
        void call_null();
        short giveShort();
        string giveString();
        Structure giveStructure();
        void takeShort(in short s);
      };

    7. Les ORBs testés.
    8. Les tests en C++ ont été effectué avec:

      • OmniORB
      • Orbacus 4
      • MICO (poa)
      • MICO(boa)

      Les tests en JAVA ont été effectué avec

      • JacORB
      • JavaORB
      • Orbacus
      • Visibroker

      La machine de test est un celeron 400 avec 64 Mo de RAM.

    9. Les résultats
    10. Les résultats en C++.


      (les temps sont donnés en ms)


      OmniORB Orbacus 4 MICO poa MICO boa
      Call Null (1er appel) 3 7 4 4
      Call Null (1000*) 171 973 791 645
      Return String (1er appel) 0 1 1 1
      Return String (1000*) 205 1061 834 683
      Return Struct (1000*) 173 985 831 680
      Give Short (1000*) 172 982 841 689
      Return Short (1000*) 173 983 824 675

      Interprétation des résultats.

      Le premier call null est aussi la première invocation de méthode. Le délai un peu plus long s’explique par le mécanisme de localisation de la machine serveur. Remarquons qu’une fois que la machine est localisée, les appels suivants sont beaucoup plus courts. Ce mécanisme n’a donc lieu qu’au premier appel.

      Remarquons que le temps constant de l’invocation rend négligeable les différences dues aux types passés en paramètre. Il est donc plus rentable de faire moins d’appel, quitte à passer plus d’arguments.

      Remarquons également la différence selon que l’on utilise pour l’adaptateur d‘objets le type BOA ou le type POA. Il est intéressant de constater une fois de plus que portabilité et performance ne font pas bon ménage.

      Remarquons pour finir, sans toutefois tirer des conclusion hâtives à quel point OmniORB se montre particulièrement à son avantage dans ce test.

      Les résultats en JAVA

      (les temps sont donnés en ms)


      JacOrb JavaORB Visibroker (Linux) Visibroker (Windows 98) Orbacus
      Call Null (1er Appel) 7 81 92 0 87
      Call Null (1000*) 2492 2404 1690 2090 1798
      Return String (1er Appel) 4 4 2 0 5
      Return String (1000*) 2507 2511 1608 1920 1967
      Give Short (1000*) 2405 2420 1531 1870 1987
      Return Short (1000*) 2403 2410 1531 1870 1987

      Interprétation des résultats.

      Ce que nous pouvons remarquer ici, cest que tous les ORB sont à peu prés équivalents en terme de performances. Visibroker (Linux) se montre le plus rapide sur tous les points mais il ny a pas un facteur de 2 en comparaison avec JavaORB qui est le plus lent. Les autres remarques sont les mêmes que celles plus haut pour les ORBs c++.

      Comparaison C++/JAVA

      Il est intéressant de comparer les ORBs c++ et les ORBs java en termes de performances. Ainsi en prenant OmniORB ( le plus rapide en c++) et visibroker ( le plus rapide en java), on saperçoit quOmniORB est 10 fois plus rapide. Lécart avec lORB le plus lent peut aller jusquà un facteur de 20. Nous avons vu que la vitesse nest pas le facteur premier cependant un facteur de 10 à 20 est non négligeable dans le cas dapplications réclamant une bonne disponibilité.

      Conclusion sur les tests effectués

      Nous tirons ici une conclusion générale des tests que nous avons effectués sur les différents ORBs.

      le plus performant

      OmniORB
      Il surpasse largement les autres produits testés. On peut voir que parmis les ORBs c++, il est à peu prés 4 à 5 fois plus rapide que les autres. C'est donc un produit très optimisé qu'on peut utiliser pour des applications critiques nécessitant des temps de réponse très brefs.

      le plus simple d'installation

      Visibroker (version Windows)
      La philosophie de Windows est complètement respectée par visibroker. L'installation se fait à la souris en cliquant sur les boutons suivants et terminer. Cette facilité d'installation permet au produit d'être opérationnel en moins de 5 minutes. Ceci est donc appréciable par rapport aux nombreux ORBs où l'on doit souvent aller lire un fichier INSTALL ou README caché au fin fond d'une arborescence de fichiers compliquée. Pas de configure, makefile, ni de variables à déclarer, cela est vraiment appréciable. Le point négatif que l'on peut soulever est la non présence des sources mais pour l'utilisateur lambda, cela n'est pas important.

      Le meilleur

      Orbacus
      C'est le produit qui réunit le mieux les deux caractéristiques vues ci dessus. Installation sans encombre, performance dans la moyenne mais il possède surtout un très bon suivi de la part de l'éditeur. Cela se traduit par une documentation abondante et complète. A quoi bon avoir l'ORB le plus performant si on ne sais pas comment l'utiliser. L'éditeur est à ce niveau très performant et reste très au courant des nouvelles normes définies par l'OMG. Orbacus est un produit qui évolue sans cesse et qui essaye d'implémenter les dernières normes le plus rapidement possible sans oublier la qualité. De plus ce produit est disponible sous un grand nombre de langages et de systèmes d'exploitation, ce qui est crucial lors du déploiement d'applications à grande échelle. La disponibilité du source de l'application permet également le déploiement sur des plateformes spécifiques comme les systèmes embarqués. Il est maintenant acquis qu'une application ouverte permet une correction des disfonctionnements beaucoup plus rapide et une sécurité accrue.


  4. Conclusions générales
  5. Cette conclusion ne va pas revenir sur les produits testés mais va rester générale à l'ensemble de l'offre d'ORBs en soulevant les points essentiels qu'il faut avoir en tête au moment du choix d'un ORB.

    Différences d’évolutions normes/produits

    De nouvelles normes de corba définies par l'OMG apparaissent régulièrement. Ces spécifications proviennent principalement de la demande d'utilisateurs pour obtenir de nouvelles fonctionnalités ou/et des éditeurs d'ORBs pour standardiser une technologie qu'ils sont les seuls à maîtriser. Ainsi avec toutes ces évolutions, il y a toujours un décalage de plusieurs mois entre l'annonce d'une nouvelle norme et son implémentation dans les principaux ORB Un produit peut très bien implémenter une nouvelle norme immédiatement car cette nouvelle norme provient d'une technologie propriétaire mais n'implémentera pas forcément des normes définies quelques mois plus tôt.

    Choix en fonction des caractéristiques

    Nous l'avons vu, la rapidité d'un ORB n'est pas le facteur principal du choix de ce dernier.

    Plus que tout, il faut d'abord analyser les besoins que l'on a pour ensuite déterminer le produit le plus apte à remplir ces besoins. C'est à dire la conformité du produits aux différentes spécifications et normes définies par l'OMG. Les ORBs les plus performants sont souvent ceux qui implémentent le moins de spécifications. Alors à quoi cela sert d'avoir l'ORB le plus rapide si il n'implémente pas les normes dont nous avons besoin.

    Il faut regarder à la disponibilité du produits sous plusieurs systèmes d'exploitation et langages différents. Rares sont les entreprises dont tous les ordinateurs fonctionnent sous le même OS et dont tous les programmeurs utilisent le même langage.

    Une fois les points ci dessus rempli, il convient de regarder:
    la qualité de documentation
    la facilité d'utilisation et de mise en oeuvre
    le suivi et service après vente de l'éditeur

    Si l'on veut utiliser efficacement l'ORB en question, ces différents se doivent d'être bons. Ils peuvent aisément conduire au choix d'un ORB plutôt qu'un autre qui aurait les mêmes spécifications.

    Le dernier critère est la rapidité de l'ORB.

    Difficulté de portabilité

    Nous l'avons vu, porter une application, écrite pour un ORB spécifique, sous un autre ORB ne se fait pas immédiatement. Il y a toujours des petits problèmes d'incompatibilité même en utilisant les normes spécifiques comme le bus POA.

    Fonctionnalités propriétaires

    Chaque éditeur ajoute des fonctionnalités propriétaires et redéfini souvent les fonctions des interfaces standards ( par exemple l'ajout d'un argument lors de l'appel à une fonction ).

    ORBs open source

    Les ORBS open source ne sont pas à négliger. Nous le remarquons avec OmniORB. Ce sont souvent des ORB qui évoluent très rapidement du fait de l'enthousiasme de la communauté de développeurs open source. Ils sont donc fournis avec les sources et ils sont gratuits. Ce dernier critère peut se révéler capital pour une utilisation restreinte ( une entreprise qui n'a pas les moyens, les particuliers ) et aussi pour une première approche de CORBA. En effet au lieu d'investir de l'argent dans un ORB payant, pourquoi ne pas tester un ORB open source ?

    Interopérabilité

    Au vu de tout cela, aucun produit ne réunit toutes ces caractéristiques. Par conséquent on peut essayer l'interopérabilité, c'est à dire prendre un ORB/c++/windows qui va privilégier la rapidité et un orb/java/linux qui sera facile à programmer et maintenir et qui apportera les services ne nécessitant pas une grande vitesse.

    Bien que minimal, ce test nous a cependant permis de mettre en évidence quelques points forts intéressants.
    N’oublions pas cependant que la performance n’est pas tout et qu’il ne faut pas se cristalliser sur tel ou tel résultat.
    Certains points évoqués dans le CORBA comparaison project ont été passé sous silence. Citons notamment le fait qu’il existe une différence de temps dans l’invocation d’une méthode selon que celle-ci est situé en tête ou en queue du contrat IDL. Cette différence pouvant atteindre 10% pour une interface comptant une centaine d’opération.
    Mettre en évidence des différences aussi minime n’était pas du tout notre propos.

    Les différences de vitesse entre ORBs pouvant comme nous l’avons constaté être sensibles, c’est donc un point qu’il ne faut pas négliger.
    Ces différences laissent présager une bonne marge de progression pour les ORBs qui actuellement sont lents mais qui par ailleurs possèdent bien d’autres qualités ce qui a terme est sans aucun doute une bonne nouvelle pour la norme CORBA. En attendant, le panachage des ORBs en fonction des besoins reste une excellente solution.


  6. Nos programmes d'évaluation
  7. Vous pouvez télécharger les programmes que nous avons utilisé pour évaluer les ORBs :

    1. Programmes pour les ORBs C++
    2. Programmes pour les ORBs Java


  8. Annexe
  9. S'il ne devait en rester qu'un ce serait ce site :
    La page CORBA de Ben Leng
    Il référence tous les sites sur CORBA et il nous a été d'un grand secour.
    Il propose des liens vers d'autres Evaluations d'ORBs en Anglais dont le CORBA Comparaison Project

    Merci à Philippe Merle pour son cours sur CORBA et ses remarques sur l'interpretation des résultats.
    Philippe Merle fait parti de l'équipe GOAL du Laboratoire d'Informatique Fondamentale de Lille (LIFL), et à entre autre concu CorbaScript, le langage de script de CORBA.