<?xml version="1.0" encoding="UTF-8"?><rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Commentaires sur : Service Stateful vs. Service Stateless</title> <atom:link href="http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Fri, 10 Feb 2012 09:50:25 +0000</lastBuildDate> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>Par : Blog Xebia France - Les 10 pièges de la SOA : 08 - La sécurité</title><link>http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-5678</link> <dc:creator>Blog Xebia France - Les 10 pièges de la SOA : 08 - La sécurité</dc:creator> <pubDate>Tue, 27 May 2008 06:26:36 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-5678</guid> <description>[...] Stateless afin de faciliter l&#8217;implémentation du fail-over et du load-balancing (Cf. &#8220;Service Stateful vs. Service Stateless&#8221; par Manuel [...]</description> <content:encoded><![CDATA[<p>[...] Stateless afin de faciliter l&#8217;implémentation du fail-over et du load-balancing (Cf. &#8220;Service Stateful vs. Service Stateless&#8221; par Manuel [...]</p> ]]></content:encoded> </item> <item><title>Par : Manuel Eveno</title><link>http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-228</link> <dc:creator>Manuel Eveno</dc:creator> <pubDate>Thu, 26 Jul 2007 09:45:33 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-228</guid> <description>Tout d&#039;abord, merci pour cette longue réaction. Je vais essayer de vous répondre point par point :
Tout d&#039;abord, je ne suis pas sûr que ce soit un faux débat. On rencontre encore régulièrement des projets qui compliquent inutilement les services, il est toujours bon de faire quelques rappels ;-)
Concernant les nombres magiques, même s&#039;ils sont manipulés au travers d&#039;une session, il n&#039;en reste pas moins que pour accéder à la session on utilise des clés. Ces clés sont des nombres magiques. L&#039;utilisation de la session risque aussi de créer une dépendance entre les services qui manipulent les mêmes données de la session.
Au sujet de la complexité cyclomatique, je mettais ici en relief le fait que, puisque le service effectue des traitements différents en fonction de &quot;nombres magiques&quot; passés en paramètre, il cumule en réalité des traitements qui devraient être réalisés via plusieurs services. Le traitement du service devient donc plus complexe à déchiffrer (il faut suivre l&#039;imbrication des if then else). De plus, que le service fasse ce test ou invoque un service qui le fait pour lui, le service reste lié aux données de la session et c&#039;est ça qui pose problème (j&#039;en reparle plus loin).
Concernant votre remarque sur le paragraphe &quot;Que faire quand l&#039;envie nous prend de changer ...&quot;, il faut, bien évidemment, garder une certaine mesure. Je préconisais de découper le service en deux quand les traitements métiers effectués sont relativement dissociables. Il est clair qu&#039;il ne faut pas tomber dans le travers de créer un service pour chaque valeur possible des paramètres.
A propos de votre remarque sur le paragraphe &quot;Le contexte et la session nuisent à la réutilisation&quot;, je parlais ici de l&#039;application appelante. Il ne faut pas effectuer des traitements en fonction de l&#039;application appelante mais bien en fonction du besoin tel qu&#039;il a été (ou devrait être) spécifié.
Voici un exemple :
Le service getContrats() est réalisé pour l&#039;application web de gestion du compte mise à disposition des clients. Il a été décidé que dans cette application web, il ne serait possible de voir que certains types de contrat. Le risque ici est de se dire que le service getContrats() puisqu&#039;il ne va (pour l&#039;instant) être appelé que par cette application web, ne retournera que les contrats du bon type. On commet ici une erreur en rendant le service spécifique au besoin d&#039;une application.
Au sujet de l&#039;exemple, il est probable que le service B n&#039;aie pas besoin de la totalité des données mis en session par le service A, il n&#039;aura probablement besoin qu&#039;une clé ou d&#039;un sous ensemble des données. En lui donnant la possibilité de les passer en paramètre, il peut par exemple mettre ces données en cache à la connexion de l&#039;utilisateur (si c&#039;est une application web).
Le fait est qu&#039;ici on a le choix alors que dans l&#039;approche stateful, il faut obligatoirement passer par l&#039;appel au service A.
Pour finir, il est vrai que les services stateful entraînent bien souvent des problèmes de performance et, dans le cas d&#039;environnement répliqué, de potentiel problème de synchronisation.</description> <content:encoded><![CDATA[<p>Tout d&#8217;abord, merci pour cette longue réaction. Je vais essayer de vous répondre point par point :</p><p>Tout d&#8217;abord, je ne suis pas sûr que ce soit un faux débat. On rencontre encore régulièrement des projets qui compliquent inutilement les services, il est toujours bon de faire quelques rappels <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>Concernant les nombres magiques, même s&#8217;ils sont manipulés au travers d&#8217;une session, il n&#8217;en reste pas moins que pour accéder à la session on utilise des clés. Ces clés sont des nombres magiques. L&#8217;utilisation de la session risque aussi de créer une dépendance entre les services qui manipulent les mêmes données de la session.</p><p>Au sujet de la complexité cyclomatique, je mettais ici en relief le fait que, puisque le service effectue des traitements différents en fonction de &laquo;&nbsp;nombres magiques&nbsp;&raquo; passés en paramètre, il cumule en réalité des traitements qui devraient être réalisés via plusieurs services. Le traitement du service devient donc plus complexe à déchiffrer (il faut suivre l&#8217;imbrication des if then else). De plus, que le service fasse ce test ou invoque un service qui le fait pour lui, le service reste lié aux données de la session et c&#8217;est ça qui pose problème (j&#8217;en reparle plus loin).</p><p>Concernant votre remarque sur le paragraphe &laquo;&nbsp;Que faire quand l&#8217;envie nous prend de changer &#8230;&nbsp;&raquo;, il faut, bien évidemment, garder une certaine mesure. Je préconisais de découper le service en deux quand les traitements métiers effectués sont relativement dissociables. Il est clair qu&#8217;il ne faut pas tomber dans le travers de créer un service pour chaque valeur possible des paramètres.</p><p>A propos de votre remarque sur le paragraphe &laquo;&nbsp;Le contexte et la session nuisent à la réutilisation&nbsp;&raquo;, je parlais ici de l&#8217;application appelante. Il ne faut pas effectuer des traitements en fonction de l&#8217;application appelante mais bien en fonction du besoin tel qu&#8217;il a été (ou devrait être) spécifié.<br
/> Voici un exemple :<br
/> Le service getContrats() est réalisé pour l&#8217;application web de gestion du compte mise à disposition des clients. Il a été décidé que dans cette application web, il ne serait possible de voir que certains types de contrat. Le risque ici est de se dire que le service getContrats() puisqu&#8217;il ne va (pour l&#8217;instant) être appelé que par cette application web, ne retournera que les contrats du bon type. On commet ici une erreur en rendant le service spécifique au besoin d&#8217;une application.</p><p>Au sujet de l&#8217;exemple, il est probable que le service B n&#8217;aie pas besoin de la totalité des données mis en session par le service A, il n&#8217;aura probablement besoin qu&#8217;une clé ou d&#8217;un sous ensemble des données. En lui donnant la possibilité de les passer en paramètre, il peut par exemple mettre ces données en cache à la connexion de l&#8217;utilisateur (si c&#8217;est une application web).<br
/> Le fait est qu&#8217;ici on a le choix alors que dans l&#8217;approche stateful, il faut obligatoirement passer par l&#8217;appel au service A.</p><p>Pour finir, il est vrai que les services stateful entraînent bien souvent des problèmes de performance et, dans le cas d&#8217;environnement répliqué, de potentiel problème de synchronisation.</p> ]]></content:encoded> </item> <item><title>Par : TINE</title><link>http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-218</link> <dc:creator>TINE</dc:creator> <pubDate>Wed, 25 Jul 2007 11:59:31 +0000</pubDate> <guid
isPermaLink="false">http://blog.xebia.fr/2007/07/24/service-stateful-vs-service-stateless/#comment-218</guid> <description>Bonjour,
Tout d’abord, je voudrais vous remercier pour la pertinence des informations et leur qualité : mon blog préféré pour suivre les nouvelles et solutions SOA.
Voici ma réaction à cet article.
Dans toutes les architectures sur lesquelles j&#039;ai personnellement traou intervenu pour différentes raisons, la notion de service (dénué de toute connotation Web service et/ou SOA) a toujours été une abstraction stateless. Il y a plein d&#039;autres choses en amont qui sont stateful mais jamais les services.
Mais bon, puisque le faux débat est lancé je me permets de faire quelques remarques.
Dans le texte on peut lire:
&quot;Ces conditions sont souvent basées sur ce que l’on appelle des nombres magiques (ou des chaînes de caractères) qui doivent être passés en paramètre par l’appelant. Ceci peut totalement nuire à la lecture du code et à sa maintenance.&quot;
Faux : étant donné que ces nombres ne sont jamais manipulés directement mais au travers d&#039;une abstraction de haut niveau qui expose une API propre et lisible et qu&#039;on appelle une session.
Le texte continue avec : &quot;En effet, un des critères des analyseurs de code ...&quot;
Tel que c&#039;est formulé, on peut comprendre que le code va inclure des conditions portant sur ces nombres magiques. Je pense que vous vouliez parler du code qui permet la récupération des données dans la session. Ce code va contenir des conditions pour savoir si les données sont disponibles ou non dans le contexte.
Mise à part la formulation stylistique, cet argument n&#039;est pas correct. Car, chaque service ne va pas dire &quot;si données dispo alors ok sinon appeler le service ad hoc&quot;. Il va tout simplement appeler une méthode qui va le faire pour lui. Les différents services ignorent alors complètement qu&#039;ils dépendent de données en provenance de la session ou suite à un appel de service. L&#039;autre façon de faire est (comme vous l&#039;écrivez) de passer directement les données extraites du contexte comme argument au service.
Remarque sur le paragraphe &quot;Que faire quand l’envie nous prend de changer...&quot;
La solution est possible pour des petits exemples ou pour écrire des bouquins. La réalité est qu&#039;il n&#039;est pas toujours possible d&#039;associer une méthode pour une situation abstraite donnée (combinaison de plusieurs valeurs possibles des données contenues dans le contexte). Car il y aura explosion combinatoire.
Remarque sur le paragraphe &quot;Le contexte et la session nuisent à la réutilisation&quot;
Dans le texte, on peut lire : &quot;Il est donc très important de développer des services qui répondent à un besoin métier et non pas au besoin d’une application.&quot;
Je crois que l&#039;auteur divague et qu&#039;il ne mesure pas la signification de ce qu&#039;il écrit. Je ne sais pas si je dois vous relancer pour faire la distinction entre service métier, service applicatif, service fonctionnel, service technique voire même service logique.
Et pour finir l&#039;exemple est mauvais car le problème qu&#039;il fait ressortir se pose également avec une conception stateless. Je m&#039;explique :
Supposons que le service B n&#039;utilise pas la session pour récupérer ses données mais qu&#039;il les reçoit en paramètre (comme c&#039;est préconisé un peu plus loin). D&#039;après votre exemple, ces données sont fournies par le service A. Donc c&#039;est à la charge de l&#039;appelant de B de les lui fournir en entrée. Comment il faut faire, il faut appeler A. Que cet appelant soit un autre service C ou n&#039;importe qui, ce sera à lui d&#039;appeler A pour les fournir à B.
Le supposé problème existe donc quelque soit la conception envisagée : stateless / stateful.
Mais en réalité, il n&#039;y aucun problème de réutilisation car lorsqu&#039;un service est défini il déclare son contrat et voilà.
Techniquement parlant, le vrai problème des services stateful est la scalabilité.
H. TINE</description> <content:encoded><![CDATA[<p>Bonjour,</p><p>Tout d’abord, je voudrais vous remercier pour la pertinence des informations et leur qualité : mon blog préféré pour suivre les nouvelles et solutions SOA.</p><p>Voici ma réaction à cet article.</p><p>Dans toutes les architectures sur lesquelles j&#8217;ai personnellement traou intervenu pour différentes raisons, la notion de service (dénué de toute connotation Web service et/ou SOA) a toujours été une abstraction stateless. Il y a plein d&#8217;autres choses en amont qui sont stateful mais jamais les services.</p><p>Mais bon, puisque le faux débat est lancé je me permets de faire quelques remarques.</p><p>Dans le texte on peut lire:<br
/> &laquo;&nbsp;Ces conditions sont souvent basées sur ce que l’on appelle des nombres magiques (ou des chaînes de caractères) qui doivent être passés en paramètre par l’appelant. Ceci peut totalement nuire à la lecture du code et à sa maintenance.&nbsp;&raquo;</p><p>Faux : étant donné que ces nombres ne sont jamais manipulés directement mais au travers d&#8217;une abstraction de haut niveau qui expose une API propre et lisible et qu&#8217;on appelle une session.</p><p>Le texte continue avec : &laquo;&nbsp;En effet, un des critères des analyseurs de code &#8230;&nbsp;&raquo;</p><p>Tel que c&#8217;est formulé, on peut comprendre que le code va inclure des conditions portant sur ces nombres magiques. Je pense que vous vouliez parler du code qui permet la récupération des données dans la session. Ce code va contenir des conditions pour savoir si les données sont disponibles ou non dans le contexte.</p><p>Mise à part la formulation stylistique, cet argument n&#8217;est pas correct. Car, chaque service ne va pas dire &laquo;&nbsp;si données dispo alors ok sinon appeler le service ad hoc&nbsp;&raquo;. Il va tout simplement appeler une méthode qui va le faire pour lui. Les différents services ignorent alors complètement qu&#8217;ils dépendent de données en provenance de la session ou suite à un appel de service. L&#8217;autre façon de faire est (comme vous l&#8217;écrivez) de passer directement les données extraites du contexte comme argument au service.</p><p>Remarque sur le paragraphe &laquo;&nbsp;Que faire quand l’envie nous prend de changer&#8230;&nbsp;&raquo;<br
/> La solution est possible pour des petits exemples ou pour écrire des bouquins. La réalité est qu&#8217;il n&#8217;est pas toujours possible d&#8217;associer une méthode pour une situation abstraite donnée (combinaison de plusieurs valeurs possibles des données contenues dans le contexte). Car il y aura explosion combinatoire.</p><p>Remarque sur le paragraphe &laquo;&nbsp;Le contexte et la session nuisent à la réutilisation&nbsp;&raquo;<br
/> Dans le texte, on peut lire : &laquo;&nbsp;Il est donc très important de développer des services qui répondent à un besoin métier et non pas au besoin d’une application.&nbsp;&raquo;</p><p>Je crois que l&#8217;auteur divague et qu&#8217;il ne mesure pas la signification de ce qu&#8217;il écrit. Je ne sais pas si je dois vous relancer pour faire la distinction entre service métier, service applicatif, service fonctionnel, service technique voire même service logique.</p><p>Et pour finir l&#8217;exemple est mauvais car le problème qu&#8217;il fait ressortir se pose également avec une conception stateless. Je m&#8217;explique :</p><p>Supposons que le service B n&#8217;utilise pas la session pour récupérer ses données mais qu&#8217;il les reçoit en paramètre (comme c&#8217;est préconisé un peu plus loin). D&#8217;après votre exemple, ces données sont fournies par le service A. Donc c&#8217;est à la charge de l&#8217;appelant de B de les lui fournir en entrée. Comment il faut faire, il faut appeler A. Que cet appelant soit un autre service C ou n&#8217;importe qui, ce sera à lui d&#8217;appeler A pour les fournir à B.</p><p>Le supposé problème existe donc quelque soit la conception envisagée : stateless / stateful.<br
/> Mais en réalité, il n&#8217;y aucun problème de réutilisation car lorsqu&#8217;un service est défini il déclare son contrat et voilà.</p><p>Techniquement parlant, le vrai problème des services stateful est la scalabilité.</p><p>H. TINE</p> ]]></content:encoded> </item> </channel> </rss>
