Stateless is priceless

1,101 views
1,019 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,101
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Stateless is priceless

  1. 1. Stateless is pricelessmercredi 7 mars 12
  2. 2. Thomas Recloux Développeur / Architecte indépendant @thomasrecloux https://github.com/trecloux/ Ch’ti JUG (co) leadermercredi 7 mars 12
  3. 3. Stateless SessionLess is pricelessmercredi 7 mars 12
  4. 4. mercredi 7 mars 12
  5. 5. Session Http ?mercredi 7 mars 12
  6. 6. Serveur JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  7. 7. Serveur JSESSIONID=1337AZERTYUIOP JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  8. 8. Serveur 1337AZERTYUIOP user com.myapp.User@45567 JSESSIONID=1337AZERTYUIOP roles [CONFIGURATION, DICTATOR] JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  9. 9. Serveur 1337AZERTYUIOP user com.myapp.User@45567 JSESSIONID=1337AZERTYUIOP roles [CONFIGURATION, DICTATOR] DFGHH76434455 user com.myapp.User@24098 JSESSIONID=1337AZERTYUIOP roles []mercredi 7 mars 12
  10. 10. Pour quoi faire ?mercredi 7 mars 12
  11. 11. 1 - Authentification En cas d’authentification par formulaire Placer un objet marqueur en session pour mémoriser l’authentificationmercredi 7 mars 12
  12. 12. 2 - Etat conversationnel Utiliser la session pour stocker l’état de la conversation entre le client et le serveur Exemples : Panier Entité en cours de modification ....mercredi 7 mars 12
  13. 13. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  14. 14. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet]mercredi 7 mars 12
  15. 15. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2mercredi 7 mars 12
  16. 16. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2 pet com.myapp.Pet@566577mercredi 7 mars 12
  17. 17. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2 pet com.myapp.Pet@566577 POST /petmercredi 7 mars 12
  18. 18. 3 - Cache Eviter de recharger des objets depuis leur système de stockage Exemples : Utilisateur, Roles Objets fréquemment utilisés : Client, Articles, .....mercredi 7 mars 12
  19. 19. Il est ou le problème ?mercredi 7 mars 12
  20. 20. 1 - Répartition de chargemercredi 7 mars 12
  21. 21. A sessionmercredi 7 mars 12
  22. 22. A session B ?mercredi 7 mars 12
  23. 23. A session Load Balancer 1337AZE RTYUIOP A Bmercredi 7 mars 12
  24. 24. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  25. 25. 2 - Tolérance aux pannesmercredi 7 mars 12
  26. 26. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  27. 27. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  28. 28. A session Load Load Balancer Balancer 1337AZE RTYUIOP A B ?mercredi 7 mars 12
  29. 29. A session Load Load Load Load Balancer Balancer Balancer Balancer A B sessionmercredi 7 mars 12
  30. 30. 3 - Fourre tout Difficile de gérer le cycle de vie des objets en session Syndrome de la session obèse, refactoring complexe Typage faiblemercredi 7 mars 12
  31. 31. 4 - Scalabilité En cas de forte charge, les sessions existantes ne peuvent pas profiter de l’ajout de nouveaux serveurs Quelle taille mémoire provisionner pour ma session ?mercredi 7 mars 12
  32. 32. 5 - Quelle durée de vie Réglage du timeout de session : durée de survie de la session après la dernière requête de l’utilisateur Trop court : la session ne survie pas à une pause dans l’utilisation de l’application Trop long : utilisation de ressources inutilesmercredi 7 mars 12
  33. 33. 6 - Mise à jour de l’application La session contient des objets complexes de l’application, elle est donc liée à une version de l’application Procédures complexe de migrationmercredi 7 mars 12
  34. 34. 7 - Ongletsmercredi 7 mars 12
  35. 35. Alors, on fait comment ?mercredi 7 mars 12
  36. 36. Stocker l’état ailleursmercredi 7 mars 12
  37. 37. URLmercredi 7 mars 12
  38. 38. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  39. 39. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  40. 40. Serveur GET /petsearch?query=dog 1337AZERTYUIOP GET /pet/543/chimpanzeemercredi 7 mars 12
  41. 41. Serveur GET /petsearch?query=dog 1337AZERTYUIOP GET /pet/543/chimpanzee POST /pet/543mercredi 7 mars 12
  42. 42. Cookie Echangé à chaque requête/réponse Peut être signé 4Ko Maximum : privilégier l’échange d’identifiants vs objets complexes Peut être persistant <!> Partagé entre les ongletsmercredi 7 mars 12
  43. 43. Champs caché Ex : Mémoriser l’identifiant de l’entité en cours de modification Onglet friendly <!> Vérifier les droits lors du GET et du POSTmercredi 7 mars 12
  44. 44. Etat coté client Arbre DOM Variables globales JavaScript Applications «Single Page» Ex : GWT Stockage local HTML5 Web Storage, Indexed DB, Web SQLmercredi 7 mars 12
  45. 45. Etat coté serveur Base de données Cache distribuémercredi 7 mars 12
  46. 46. mercredi 7 mars 12
  47. 47. mercredi 7 mars 12
  48. 48. Spring MVC / Securitymercredi 7 mars 12
  49. 49. Authentification Spring security 3.1 dispose d’un mode «stateless» Qui ne fonctionne pas en authentification par formulaire Solution : utiliser l’authentification «Remember Me» <!> Uniquement en mode «Token»mercredi 7 mars 12
  50. 50. spring-security.xml <http .... create-session="stateless"> .... <remember-me key="myRememberMeKey" /> </http> login.jsp <form id=form Texte Texte action="<c:url value="/j_spring_security_check"/>" method="POST"> <input type="hidden" value="true" name="_spring_security_remember_me" /> ... </form>mercredi 7 mars 12
  51. 51. Entité en cours de modification Se passer du très utile @SessionAttributesmercredi 7 mars 12
  52. 52. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /petmercredi 7 mars 12
  53. 53. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /pet 1 - Récupérer l’attribut en session 2 - «Binding» à partir des données du POST 3 - Appel de la méthode du contrôleurmercredi 7 mars 12
  54. 54. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /pet 1 - Récupérer l’attribut en session 1 - Charger l’entité depuis la base de données 2 - «Binding» à partir des données du POST 3 - Appel de la méthode du contrôleurmercredi 7 mars 12
  55. 55. Une solution : Annoter une méthode avec @ModelAttribute permet de l’insérer dans le traitement de la requête avant le «binding» Cette méthode peut prendre les même paramètres qu’une méthode de Contrôleurmercredi 7 mars 12
  56. 56. Démomercredi 7 mars 12
  57. 57. Questions ?mercredi 7 mars 12

×