C'est quoi un framework web service? :
- coté client : de générer les classes à partir d'un WSDL permettant de créer une grappe d'objet correspondant au message SOAP du web service de façon transparente.
- coté serveur : de récupérer une requête HTTP SOAP, de transformer le contenu du message en une grappe d'objets, d'appeler une méthode java correspondant à la requête puis de récupérer l'objet en retour de l'appel de la méthode et de le transformer en réponse HTTP SOAP.
- Contract first : définir un contrat d'échange et ensuite de s'appuyer sur ce contrat pour développer le service à l'aide du framework.
- Code first : développer un service java et ensuite s'appuyer sur le framework pour qu'il expose la méthode sous forme de web service.
Les frameworks testés :
Je me suis attardé sur les frameworks les plus connus :
- Apache Axis2 (version 1.5.1)
- Apache Cxf (version 2.2.5)
- Spring ws (version 1.5.9)
L'objectif du bench est de mesurer le temps passé dans les couches techniques des frameworks web services en dehors du réel traitement que doit effectuer le web service et cela différent niveau de charge. Le tout est de pouvoir mesurer l'overhead engendré par les frameworks web services par rapport à un appel direct de méthode en java et de comparer cet overhead. Le bench se focalise sur les temps de traitements coté serveur :
Caractéristiques du bench :
- les web services exposés :
La requête en entrée ainsi que la réponse en retour sont représentatifs d'un "vrai" web service (dans le sens ou ce n'est pas un simple hello world) :
- 60 données unitaires
- 3 niveaux de profondeur
- requête SOAP de 3.75 Ko
- Du coté du client :
- Du coté du serveur :
- procédure du bench :
Résultats :
Voici le tableau détaillé :
Dans le cadre de ce bench, CXF est donc le framework le plus performant suivi d'assez prêt par Spring ws. Axis2 est clairement moins performant indépendamment du niveau de charge coté serveur.
Conclusion :
J'ai été confronté à quelques problèmes de déploiement sur JBoss à cause de librairies utilisées à la fois par les frameworks et par JBoss avec Axis2 et Spring ws. Sur cet aspect là, la communauté et la documentation autour de Spring permettent de résoudre rapidement le problème alors que pour Axis2, il a fallu creuser un peu plus.
12 comments:
Merci Jérèmy pour cet article très detaillé.
Quelle option de marshaling as tu utilisé pour spring-ws ? JAXB ?
@thomas : En effet, j'ai utilisé l'option de marshalling avec Jaxb2 pour obtenir quelque chose de comparable.
Pour axis2, tu n'as pas eu de problème de connexion http qui fait un timeout du au fait que le stub client n'est pas threadsafe? De plus, axis2 ne permet par défaut que 2 connexions par requête je crois..
@Tim, mon client est un client basé sur commons-httpclient et non un client axis2.
Bonjour,
Je m'occupe récemment du développement du client ws pour ma boite, j'ai obtenu la .wsdl et les .xsd (pour la validation des données). J'ai choisi spring-ws. Peux-tu m'indiquer comment faire pour généré la grappe d'objets en prenant en compte les .xsd avec spring-ws.
Merci
@jupuzzler: Il est en effet possible d'utiliser spring ws coté client (ce n'était pas le cas dans le cadre du bench).La documentation de spring ws sur le sujet est un bon point de départ : http://static.springsource.org/spring-ws/sites/1.5/reference/html/client.html#d0e3378 (chapitre 6.2.2 et chapitre 6.2.3)
Très bon article.
Serait-il possible que tu mettes les sources avec?
@Ghalleb : ça aurait été avec plaisir mais le code est lié au client chez lequel j'interviens et je préfère dans ce cadre ne pas le diffuser.
Très intéressant, merci!
Simple question: Tu dis t'être attardé sur les principaux frameworks. Est-ce que Sun-Metro n'en fait pas partie, selon toi?
En effet, tu as raison Sun metro en fait aussi partie mais je n'en n'avait que très peu entendu parler. Je ne l'ai pas intégré dans le test car il me paraissait beaucoup moins utilisé mais je me trompe peut être.
Bonjour,
Super l'article. Il confirme ce que je constate avec le stub Axis 1.5.6.
Pensez-vous qu'il y a moyen de contourner le problème ? Est-ce que la mise en place de MultiThreadedHttpConnectionManager http://axis.apache.org/axis2/java/core/docs/http-transport.html#setting_cached_httpclient_object pourrait régler le souci de montée en charge ?
Merci.
Je pense que le meilleur moyen de contourner le problème c'est de ne pas l'utiliser :-). Plus sérieusement, je ne sais pas, je n'ai pas creuser.
Post a Comment