Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Stateful is Beautiful

Stateful is Beautiful

Présentation sur les aspects méconnus des architectures Stateful et sur les raisons qui font qu'elles sont souvent négligées.

Antoine Sabot-Durand

April 20, 2012
Tweet

More Decks by Antoine Sabot-Durand

Other Decks in Programming

Transcript

  1. Antoine Sabot-Durand Expert Java EE 16 ans d’expérience Leader sur

    Seam Social Membre de l’EG CDI 1.1 Twitter : @antoine_sd Hastag : #StatefulIsBeautiful <ego>A propos de... </ego> samedi 21 avril 12
  2. Stateless / Stateful & cie EJB CDI JPA De quoi

    sera-t’il question ? samedi 21 avril 12
  3. Stateless / Stateful & cie EJB CDI JPA Pattern Stateful

    De quoi sera-t’il question ? samedi 21 avril 12
  4. Stateless / Stateful & cie EJB CDI JPA Pattern Stateful

    des trolls sur Spring De quoi sera-t’il question ? samedi 21 avril 12
  5. De quoi parle-t’on ? La stack Java EE dispose de

    3 approches possibles : samedi 21 avril 12
  6. De quoi parle-t’on ? La stack Java EE dispose de

    3 approches possibles : samedi 21 avril 12
  7. De quoi parle-t’on ? La stack Java EE dispose de

    3 approches possibles : StateLess samedi 21 avril 12
  8. De quoi parle-t’on ? La stack Java EE dispose de

    3 approches possibles : StateLess Stateful Dry samedi 21 avril 12
  9. De quoi parle-t’on ? La stack Java EE dispose de

    3 approches possibles : StateLess Stateful Dry StateFul samedi 21 avril 12
  10. StateLess Aucun état côté serveur Tout est stocké côté client

    Le client gère la mise à jour samedi 21 avril 12
  11. StateLess Aucun état côté serveur Tout est stocké côté client

    Le client gère la mise à jour La même requête donnera toujours le même résultat samedi 21 avril 12
  12. Stateful Dry L’état est stocké côté serveur Il est «déshydraté»

    via une solution de cache ou dans une BDD samedi 21 avril 12
  13. Stateful Dry L’état est stocké côté serveur Il est «déshydraté»

    via une solution de cache ou dans une BDD Puis réhydraté à chaque requête pour récréer le contexte utilisateur samedi 21 avril 12
  14. Stateful Dry L’état est stocké côté serveur Il est «déshydraté»

    via une solution de cache ou dans une BDD Puis réhydraté à chaque requête pour récréer le contexte utilisateur A la fin de la requête l’état en mémoire est détruit samedi 21 avril 12
  15. Stateful Le serveur stocke l’état de session utilisateur Cet état

    est accessible en mémoire samedi 21 avril 12
  16. Stateful Le serveur stocke l’état de session utilisateur Cet état

    est accessible en mémoire Le client se contente de transmettre un id samedi 21 avril 12
  17. Stateful dry vs Stateless ? Sont souvent confondus L’appli full

    Stateless ne créé pas d’état mémoire temporaire samedi 21 avril 12
  18. Stateful dry vs Stateless ? Sont souvent confondus L’appli full

    Stateless ne créé pas d’état mémoire temporaire Le full Stateless est donc plus rare qu’on ne le pense samedi 21 avril 12
  19. Les légendes urbaines Lourd et Compliqué Non scalable Contre nature

    car http est stateless Le Stateful c’est... samedi 21 avril 12
  20. Les légendes urbaines Lourd et Compliqué Non scalable Contre nature

    car http est stateless Ringard Le Stateful c’est... samedi 21 avril 12
  21. Les légendes urbaines Lourd et Compliqué Non scalable Contre nature

    car http est stateless Ringard Cancérigène Le Stateful c’est... samedi 21 avril 12
  22. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 samedi 21 avril 12
  23. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 samedi 21 avril 12
  24. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 samedi 21 avril 12
  25. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 samedi 21 avril 12
  26. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 samedi 21 avril 12
  27. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java SE 5.0 30/09/2004 samedi 21 avril 12
  28. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java SE 5.0 30/09/2004 samedi 21 avril 12
  29. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 samedi 21 avril 12
  30. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 samedi 21 avril 12
  31. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 samedi 21 avril 12
  32. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Spring 1.0 24/03/2004 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 samedi 21 avril 12
  33. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Spring 1.0 24/03/2004 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 Spring 2.0 03/10/2006 samedi 21 avril 12
  34. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Spring 1.0 24/03/2004 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 Spring 2.0 03/10/2006 Spring 2.5 supporte les annotations 17/11/2007 samedi 21 avril 12
  35. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Spring 1.0 24/03/2004 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 Spring 2.0 03/10/2006 Spring 2.5 supporte les annotations 17/11/2007 Spring 2.5.1 supporte les EJB3 11/01/2008 samedi 21 avril 12
  36. Historique Java EE 1998 1999 2000 2001 2002 2003 2004

    2005 2006 2007 2008 2009 2010 2011 Spring arrive sur Sourceforge 20/02/2003 Spring 1.0 24/03/2004 Java Professional Edition Mai 1999 J2EE 1.2 12/12/1999 J2EE 1.3 24/09/2001 J2EE 1.4 11/11/2003 Java EE 5 11/05/2006 Java EE 6 10/12/2009 Java SE 5.0 30/09/2004 Spring 2.0 03/10/2006 Spring 2.5 supporte les annotations 17/11/2007 Spring 3.0 19/12/2009 Spring 2.5.1 supporte les EJB3 11/01/2008 samedi 21 avril 12
  37. La réalité Plus de la moitié des développements Java utilisent

    Spring Spring supporte le Stateful à contre coeur et de manière très partielle samedi 21 avril 12
  38. La réalité Plus de la moitié des développements Java utilisent

    Spring Spring supporte le Stateful à contre coeur et de manière très partielle Les problèmes de scalabilité du stateful sont solutionnables mais pas avec Spring samedi 21 avril 12
  39. La réalité Plus de la moitié des développements Java utilisent

    Spring Spring supporte le Stateful à contre coeur et de manière très partielle Les problèmes de scalabilité du stateful sont solutionnables mais pas avec Spring Donc près de 3/4 des developpeurs Java jugent le stateful à travers un outil inadapté au stateful samedi 21 avril 12
  40. « Un outil ou framework, pour lequel une équipe a

    acquis un niveau de compétence tel qu’il sera systématiquement mis en oeuvre pour toute nouvelle problématique quelque soit son niveau d’adéquation aux besoins réels » « Quand on détient un marteau doré, tous les problèmes ressemblent à un clou » Spring, le Marteau Doré samedi 21 avril 12
  41. Les Acteurs du Stateful Les scopes servlet et JSF CDI

    et ses scopes EJB 3.X et son @stateful samedi 21 avril 12
  42. Les Acteurs du Stateful Les scopes servlet et JSF CDI

    et ses scopes EJB 3.X et son @stateful JPA et le persistence context samedi 21 avril 12
  43. Scopes servlet et JSF Scope Application La session Le Scope

    view : qui permet de stocker de l’information le temps d’une vue samedi 21 avril 12
  44. Scopes servlet et JSF Scope Application La session Le Scope

    view : qui permet de stocker de l’information le temps d’une vue Le Scope Flash : qui survit d’une requête à l’autre samedi 21 avril 12
  45. Scopes servlet et JSF Scope Application La session Le Scope

    view : qui permet de stocker de l’information le temps d’une vue Le Scope Flash : qui survit d’une requête à l’autre Le scope requête : le scope du Stateful Dry samedi 21 avril 12
  46. CDI 1/2 Solution d’injection de dépendance couplage faible fortement typée

    Patterns mis en oeuvre Interceptor samedi 21 avril 12
  47. CDI 1/2 Solution d’injection de dépendance couplage faible fortement typée

    Patterns mis en oeuvre Interceptor Decorator samedi 21 avril 12
  48. CDI 1/2 Solution d’injection de dépendance couplage faible fortement typée

    Patterns mis en oeuvre Interceptor Decorator Observer samedi 21 avril 12
  49. CDI 1/2 Solution d’injection de dépendance couplage faible fortement typée

    Patterns mis en oeuvre Interceptor Decorator Observer Scope conversation : je contrôle enfin le cycle de vie de mon scope samedi 21 avril 12
  50. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice samedi 21 avril 12
  51. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB samedi 21 avril 12
  52. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé samedi 21 avril 12
  53. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 samedi 21 avril 12
  54. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 samedi 21 avril 12
  55. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 Ne fonctionne qu’avec JSF samedi 21 avril 12
  56. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 Ne fonctionne qu’avec JSF Extension pour JSF, Servlet, Gwt, Wicket samedi 21 avril 12
  57. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 Ne fonctionne qu’avec JSF Extension pour JSF, Servlet, Gwt, Wicket Tourne aussi sur Java SE en standalone samedi 21 avril 12
  58. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 Ne fonctionne qu’avec JSF Extension pour JSF, Servlet, Gwt, Wicket Tourne aussi sur Java SE en standalone Pas d’interoperrabilité avec Spring samedi 21 avril 12
  59. CDI 2/2 Les idées reçues CDI 1.0 n’est pas exploitable

    car trop jeune Héritage de Seam & Guice Nécessite de travailler avec les EJB Les deux se marient bien mais rien n’est obligé Ne fonctionne qu’avec Java EE 6 Tourne sur Tomcat 6 Ne fonctionne qu’avec JSF Extension pour JSF, Servlet, Gwt, Wicket Tourne aussi sur Java SE en standalone Pas d’interoperrabilité avec Spring Extension CDI-Spring bridge dans les deux sens samedi 21 avril 12
  60. LES EJB 1/2 Transactionnels et distribuables Existent en plusieurs parfum

    : Stateless Stateful Gèrent la planification, le JMS samedi 21 avril 12
  61. LES EJB 1/2 Transactionnels et distribuables Existent en plusieurs parfum

    : Stateless Stateful Gèrent la planification, le JMS Disposent d’un conteneur spécifique géré par le serveur samedi 21 avril 12
  62. LES EJB 1/2 Transactionnels et distribuables Existent en plusieurs parfum

    : Stateless Stateful Gèrent la planification, le JMS Disposent d’un conteneur spécifique géré par le serveur Permettant de partager naturellement des services entre plusieurs applications samedi 21 avril 12
  63. LES EJB 1/2 Transactionnels et distribuables Existent en plusieurs parfum

    : Stateless Stateful Gèrent la planification, le JMS Disposent d’un conteneur spécifique géré par le serveur Permettant de partager naturellement des services entre plusieurs applications Par défaut sont des Bean CDI samedi 21 avril 12
  64. LES EJB 2/2 idées reçues @Stateful public class MonEjb {

    public void MaMethode(){ ... } } samedi 21 avril 12
  65. LES EJB 2/2 idées reçues Lourd et compliqués @Stateful public

    class MonEjb { public void MaMethode(){ ... } } samedi 21 avril 12
  66. LES EJB 2/2 idées reçues Lourd et compliqués Pas testables

    @Stateful public class MonEjb { public void MaMethode(){ ... } } samedi 21 avril 12
  67. LES EJB 2/2 idées reçues Lourd et compliqués Pas testables

    Ne font que du stateful @Stateful public class MonEjb { public void MaMethode(){ ... } } samedi 21 avril 12
  68. LES EJB 2/2 idées reçues Lourd et compliqués Pas testables

    Ne font que du stateful Utilisable que dans des développements Web @Stateful public class MonEjb { public void MaMethode(){ ... } } samedi 21 avril 12
  69. Le Persistence context En provenance de JPA Gère l’interaction avec

    la BDD Le Mapping avec les entités samedi 21 avril 12
  70. Le Persistence context En provenance de JPA Gère l’interaction avec

    la BDD Le Mapping avec les entités Le cache de niveau 1 : l’entity manager cache les entités qu’il manage samedi 21 avril 12
  71. Le Persistence context En provenance de JPA Gère l’interaction avec

    la BDD Le Mapping avec les entités Le cache de niveau 1 : l’entity manager cache les entités qu’il manage Le cache de niveau 2 : JPA cache ses interactions avec la BDD samedi 21 avril 12
  72. Le Persistence context En provenance de JPA Gère l’interaction avec

    la BDD Le Mapping avec les entités Le cache de niveau 1 : l’entity manager cache les entités qu’il manage Le cache de niveau 2 : JPA cache ses interactions avec la BDD Vaut mieux qu’un DAO Stateless samedi 21 avril 12
  73. Ces outils sont vos amis Polyvalents Facile à prendre en

    mai Savent cohabiter avec votre marteau doré Permettent de créer des architectures nouvelles Arrêtez de tordre Spring quand Java EE est plus adapté samedi 21 avril 12
  74. Pourquoi a-t’on oublié... La sérialisation des services ? Parce que

    les bean spring ne sont pas facilement serialisables (problèmes avec les proxys d’injection) Parce qu’elle n’est utile que dans le cadre d’une architecture Stateful La Passivation des services ? Parce qu’elle ne fonctionne que si la serialisation est possible Parce que le conteneur Spring ne l'intègre pas dans son cycle de vie samedi 21 avril 12
  75. Mais il n’est pas trop tard Les EJB et les

    bean CDI sont vraiment serialisables Du coup la passivation est utilisable Pour les EJB c’est monnaie courant et facile à gérer avec @PrePassivate et @PostActivate Et peut servir à tranformer le StateFul en StateDry automatiquement : la sérialization devient un stockage lent pour les beans non sollicités depuis un temps donné samedi 21 avril 12
  76. Le Stateful peut être restful Etre stateful n’empêche pas la

    résilience : Possibilité de récréer une session à partir d’une information envoyée par le client. Ainsi tout une partie de l’application peut rester restful et une autre peut n’être que stateful : Catalogue, puis tunnel de vente. samedi 21 avril 12
  77. Architectures possibles 1/2 Pour ceux qui aiment les couches Il

    est toujours possible de faire ça On peut même en mettre plus qu’avec Spring samedi 21 avril 12
  78. Architectures possibles 3/3 Une architecture beaucoup plus ramassée Mise en

    oeuvre du pattern Gateway Permet un développement rapide samedi 21 avril 12
  79. Architectures possibles 3/3 Une architecture beaucoup plus ramassée Mise en

    oeuvre du pattern Gateway Permet un développement rapide samedi 21 avril 12
  80. Conclusion : Les outils du Stateful permettent de faire aussi

    du Stateless (sans être tordus). samedi 21 avril 12