2016-03-01 2 views
2

J'ai toujours utilisé la portée session dans mon application cfml pour faire des choses comme stocker l'objet actuellement connecté user. C'est bien!comment gérer l'état de cfcs dans un environnement en cluster

user.isLoggedIn(), user.hasPremiumAccess(), user.hasRole('admin')

En tentant de migrer mon application à un environnement en cluster (nuage), je me rends compte que le recours à la portée session est inférieure idéale puisque chaque instance de l'application en cours d'exécution a son propre serveur Mémoire. Je sais que je pourrais utiliser des "sessions persistantes", mais je préférerais ne pas le faire car cela empêcherait quelque chose comme Amazon Elastic Beanstalk de tourner librement des instances de l'application (en fonction de la charge). Je sais aussi que je pourrais utiliser la portée client pour stocker des valeurs simples d'une manière conviviale pour les clusters, mais qu'en est-il des données complexes, comme l'objet utilisateur que j'ai décrit? Comment stockez-vous l'objet utilisateur ou quelle autre approche puis-je utiliser?

Je peux apporter des modifications aux applications si nécessaire.

** EDIT ** pour être clair, ce n'est pas que je ne peux pas utiliser des sessions collantes, c'est que je ne veux pas utiliser des sessions collantes (ou la réplication de session). La raison en est que je peux tirer parti des avantages de l'extensibilité totale de ne pas compter sur la mémoire serveur/instance pour gérer l'état de la session. Cette approche permet à un service tel qu'Elastic Beanstalk de créer et de supprimer librement des instances de serveur d'applications sans affecter l'utilisateur du tout. L'utilisation de sessions persistantes ne le permet pas.

Quelques solutions possibles je sont pris en considération:

  1. Sérialisation/désérialisation « état » de l'utilisateur de l'objet utilisateur à stocker dans champ client et « réinitialisant » utilisateur sur chaque chargement de la page
  2. Sérialisation/désérialisation « état » de l'utilisateur de l'objet utilisateur à stocker dans NoSQL db et « réinitialisant » utilisateur sur chaque chargement de la page
+0

Si vous tentez de utilisez ColdFusion sur Elastic Beanstalk, puis lisez ce message de bogue - [AWS Elastic Beanstalk rejette ColdFusion WARs] (https://bugbase.adobe.com/index.cfm?event=bug&id=3365388) et le post relatif ici - http: // stackoverflow .com/q/12217424/1636917 –

+0

Intéressant. J'essaye d'exécuter un conteneur docker en production (oui, sur Elastic Beanstalk), donc si toutes les promesses sont vraies, tant que le démon docker tourne sur l'instance EC2 (ce qu'il fait), l'application lucee vivant dans le docker le conteneur devrait également fonctionner. Certainement en train de traverser quelques obstacles, mais les doigts croisés. –

+0

Lucee (Railo) n'a pas le problème de ce bug, il se rapporte à Adobe CF seulement je pense. –

Répondre

4

Si vous ne/ne pouvez pas utiliser " sessions collantes », une autre option consiste à implémenter la réplication de session. Cela copie littéralement la session stockée en mémoire sur chaque nœud du cluster. Et, oui, il y a des frais généraux à faire cela.

De la documentation:

Pour mettre en œuvre la reprise de session pour les instances de serveur dans un cluster, activez la réplication de session pour chaque instance de serveur. La réplication de session coordonne les informations de session en temps réel parmi les instances de serveur dans un cluster. L'activation de la réplication de session permet à Tomcat d'acheminer automatiquement une requête vers un serveur en cours d'exécution si le serveur actuel n'est pas disponible.

Remarque: Lorsqu'un cluster utilise la réplication de session, les données de session sont copiées sur d'autres serveurs du cluster chaque fois qu'il est modifié. Cela peut dégrader les performances si vous stockez une quantité importante d'informations dans la portée de session. Si vous envisagez de stocker une quantité importante d'informations dans la portée de session, pensez à stocker ces informations dans les variables client enregistrées dans une base de données.

De - Enabling clustering for load balancing and failover

Une autre mise en garde qui est mentionné plus loin sur cette page:

Si vous utilisez la réplication de session, accédez à la page Variables de mémoire et activer les sessions J2EE. Activez les sessions J2EE pour toutes les instances de serveur du cluster. Si les sessions J2EE ne sont pas activées dans ColdFusion Administrator, la réplication de session ne fonctionne pas correctement. La sérialisation CFC vous permet d'utiliser la réplication de session J2EE dans un cluster et d'accéder aux CFC dans les données de session de toutes les instances du cluster. La réplication de session garantit également que les variables d'étendue de session sont répliquées dans le cluster. Toutefois, la réplication de session ne prend pas en charge la réplication des tableaux dans les variables CFC ou les variables de portée Session. Vous pouvez également conserver et accéder aux données dans une CFC dans le cas d'un basculement de session. Les structures ColdFusion stockées dans la portée de session sont disponibles dans la portée de session, même après le basculement. Par exemple, si vous exécutez plusieurs instances ColdFusion pour équilibrer la charge du serveur, vous pouvez stocker des données utiles, y compris des diagrammes CFC, dans la session afin de pouvoir accéder aux données sur toutes les pages qui sont servies dans cette session.

Et aussi vérifier cette réponse à la même question tout à l'heure (notez qu'il y avait un bug dans les versions antérieures de ColdFusion 10 qui ne permettait pas à la réplication de session de travail) - https://serverfault.com/a/602373/135433

+0

Merci pour votre réponse Miguel! Je préfère rendre les choses plus simples, plutôt que plus complexes, alors disons que je suis prêt à modifier mon application pour la rendre apatride. Quel est le meilleur moyen de stocker des objets complexes dans un environnement sans état? Sérialiser et désérialiser un état cfc en quelque sorte et stocker cela dans un db comme json? "Repopulation" cet utilisateur sur chaque requête? Autre chose? –

+0

Je n'utilise généralement que des sessions sticky dans nos environnements à charge équilibrée (pour simplifier les choses). Donc pas sûr que je puisse être d'une grande aide pour votre question. Mais ma première pensée est que si votre application est vraiment apatride alors pourquoi auriez-vous besoin de partager quelque chose entre eux? –

+0

Merci Miguel. Je vais peut-être aller avec des sessions gluantes pendant un moment, mais à la fin de la journée, ce qui doit être stocké, ce sont les données de session, seulement que pour rendre l'application "apatride", elle doit être stockée de telle sorte qu'elle ne soit pas dépend de la mémoire du serveur de l'instance du serveur sur laquelle elle est exécutée. C'est là que j'ai vu la portée du client souvent utilisée ... le problème étant que le client ne peut pas stocker des données complexes sans un hackery. Je cherche vraiment des idées. –