web-dev-qa-db-fra.com

Services Web vs EJB vs RMI, avantages et inconvénients?

Mon serveur Web serait surchargé rapidement si tout le travail y était effectué. Je vais placer un deuxième serveur derrière lui, pour traiter les données.

Quel est l'avantage d'EJB sur RMI, ou vice versa?

Qu'en est-il des services Web (SOAP, REST)?

55
Dean J

Les EJB sont construits sur RMI. Les deux impliquent Java clients et beans. Si vos clients doivent être écrits dans autre chose (par exemple, .NET, PHP, etc.), allez avec des services Web ou autre chose qui parle d'une plate-forme indépendante protocole filaire, comme HTTP ou XML sur HTTP ou SOAP.

Si vous choisissez RMI, vous n'avez pas besoin d'un serveur d'application Java EE EJB. Vous devez synchroniser les JVM client et serveur; vous ne pouvez pas mettre à niveau le client sans mettre à niveau le serveur. Vous devez écrire tous les services que le serveur d'application EJB fournit pour vous (par exemple, regroupement de connexions, services de nommage et d'annuaire, regroupement, mise en file d'attente des demandes, transactions, etc.).

RMI est un niveau assez bas quand on y pense. Pourquoi voudriez-vous revenir à CORBA?

Un meilleur choix est EJB 3.0 contre Spring. Cela dépend si vous aimez le développement POJO, souhaitez un choix de technologies relationnelles en plus de l'ORM et du JPA, entre autres.

Vous pouvez payer pour un Java EE (par exemple, WebLogic, WebSphere) ou utiliser un serveur open source (JBOSS, Glassfish et OpenEJB et ActiveMQ), ou vous pouvez vous en tenir à Spring et déployer sur Tomcat, Jetty, Resin ou tout autre moteur servlet/JSP.

Spring offre beaucoup de choix en étant indépendant de la technologie: persistance (Hibernate, iBatis, JDBC, JDO, JPA, TopLink), remoting (HTTP, Hessian, Burlap, RMI, SOAP service Web), etc.

EJB 3.0 est une spécification avec de nombreux fournisseurs; Le printemps ne peut être obtenu qu'à partir de Spring Source.

Je recommanderais printemps . Il est très solide, a beaucoup de traction, ne va nulle part. Il laisse toutes vos options ouvertes.

Les services Web sont excellents en théorie, mais vous devez faire attention à certains pièges:

  1. Latence. Première loi de Fowler sur les objets distribués: "Ne faites pas!" Une architecture composée de beaucoup de services distribués à grains fins SOAP sera élégant, beau et lent comme de la mélasse. Réfléchissez bien avant de distribuer.
  2. Le passage de XML à des objets et inversement consomme des cycles de processeur qui ne fournissent aucune valeur commerciale en plus de permettre à vos clients de parler d'un protocole indépendant de la plate-forme.
  3. SOAP est une norme qui devient de plus en plus gonflée et complexe chaque jour, mais elle prend en charge de nombreux outils. Les fournisseurs aiment ça car cela aide à stimuler les ventes d'ESB. REST est simple mais pas aussi bien compris. Il n'est pas pris en charge par les outils.

Le module de service Web de Spring est très bon, mais soyez prudent lorsque vous choisissez de déployer de cette façon. Écrivez en termes d'interfaces de service POJO. Celles-ci vous permettront d'obtenir l'isolement conceptuel que vous souhaitez, de reporter le choix de déploiement jusqu'au dernier moment et de changer d'avis si la première pensée ne fonctionne pas bien.

117
duffymo

Entre EJB et RMI, EJB serait certainement mieux - il a tout ce que RMI a et bien plus via le conteneur (pool d'objets, gestion des transactions, etc.)

Entre l'EJB et les services Web, les services Web vous offriraient plus de portabilité si vous souhaitez pouvoir les appeler à partir d'applications non Java à l'avenir. EJB vous offre à nouveau des éléments tels que la gestion des transactions et la mise en commun que vous ne pourrez peut-être pas "sortir de la boîte" avec les services Web.

Personnellement, si je le faisais, j'utiliserais probablement EJB ou un cadre d'objet distant similaire (la télécommande à ressort me vient également à l'esprit). Si vous avez besoin de pouvoir appeler les objets à partir d'une application non Java, vous pouvez toujours faire face à vos EJB avec des procurations de service Web simples selon les besoins.

10
Eric Petroelje

Re: services Web (SOAP, REST) ​​Si vos serveurs principaux ne seront pas exposés publiquement, vous n'obtiendrez aucun avantage à utiliser des interfaces de service Web indépendantes de la plate-forme telles que SOAP/REST.
En fait, vous encourrez une pénalité avec tous les frais généraux ajoutés par les balises XML qui enveloppent les données sur un appel distant, sans parler du coup que vous prendrez pour le marshaling et le dé-marshalling du XML vers Java objets.
Bien que tout appel distribué va nécessiter un certain niveau de sérialisation - même RMI/EJB, mais le prix est plus élevé lors de la sérialisation en XML lisible par l'homme.

Vous n'aurez peut-être pas du tout besoin de coder les appels distants dans Java, vous pouvez fronter votre service avec une simple instance Apache httpd, qui est configurée pour équilibrer la charge sur plusieurs serveurs Java en utilisant - mod_jk ou mod_proxy .
Ces modules peuvent être utilisés pour équilibrer la charge entre les conteneurs de servlet tels que Tomcat/jetty ou les conteneurs ejb tels que jboss/glassfish.

4
crowne