Singleton en environnement Cluster

Quelle est la meilleure stratégie pour réorienter un objet Singleton vers un environnement de cluster?

nous utilisons Singleton pour mettre en cache des informations personnalisées de la base de données. Son la plupart du temps en lecture seule, mais se rafraîchit quand un événement particulier se produit.

maintenant notre application doit être déployée dans un environnement de cluster. Par définition, chaque JVM aura sa propre instance unique. Donc le cache peut être désynchronisé entre le JVM quand un événement de rafraîchissement se produit sur un seul noeud et que son cache est rafraîchi.

Quelle est la meilleure façon de synchroniser le cache?

Merci.

Edit: le cache est principalement utilisé pour fournir une liste autocomplète (raisons de performance) à L'interface utilisateur et nous utilisons Websphere. Tous les conseils relatifs à Websphere sont les bienvenus.

43
demandé sur Amro 2009-07-28 17:31:40

9 réponses

les approches les plus simples sont:

  1. Ajouter un timer d'expiration à votre cache singleton de sorte que de temps en temps le cache soit purgé et les appels subsquents récupèrent les données mises à jour à partir de la source (par exemple une base de données)

  2. implémenter un mécanisme de notification pour le cache en utilisant quelque chose comme un sujet JMS/tibRV. Demandez à chaque instance de cache de s'abonner et de réagir à tout message de changement diffusé sur ce sujet.

9
répondu pjp 2009-07-28 13:54:30

remplacez votre cache singleton par un cache distribué.

une de ces caches pourrait être JBoss Infinispan mais je suis sûr que d'autres technologies de cache et de grille distribuées existent, y compris des technologies commerciales qui sont probablement plus matures à ce stade.

pour les objets singleton en général, je ne suis pas sûr. Je pense que j'essaierais de ne pas avoir de singleton en premier lieu.

16
répondu Chris Vest 2009-07-28 13:35:51

vous pouvez utiliser le DistributedMap qui est intégré dans WAS.

- Rick

8
répondu Rick 2009-08-04 21:57:38

ou quelque chose comme memcached

http://www.danga.com/memcached /

qu'est-ce que memcached? memcached est un mémoire distribuée haute performance objet système de mise en cache, generiques nature, mais destiné à être utilisé dans accélérer les applications web dynamiques en allégeant la charge de la base de données.

Danga Interactive développé memcached pour améliorer la vitesse de LiveJournal.com, un site qui a été déjà 20 millions+ page dynamique vues par jour pour 1 million d'utilisateurs avec un tas de serveurs web et un tas de serveurs de base de données. memcached abandonné la charge de base de données pour presque rien, des temps de chargement de page plus rapides pour utilisateurs, meilleure utilisation des ressources, accès rapide aux bases de données sur une miss memcache.

4
répondu monkey_p 2009-07-28 13:55:42

si possible, utilisez le support de votre serveur app pour cela, si possible (certains l'ont, d'autres pas). Par exemple, nous utilisons le support de JBoss pour un "HA Singleton" qui est un service qui ne fonctionne que sur le noeud maître cluster. Il n'est pas parfait (vous devez gérer le cas où il pète cerveau de temps en temps), mais il est assez bon.

sans cela, vous pouvez être en mesure de concevoir quelque chose en utilisant JGroups, qui fournit avec cluster node auto-découverte et négociation, mais il est non-trivial.

en dernier recours, vous pouvez utiliser le verrouillage de la base de données pour gérer les singletons cluster, mais c'est sérieusement fragile. Pas recommandé.

comme alternative à un cluster singleton, vous pouvez utiliser un cache distribué à la place. Je recommande JBossCache (qui n'a pas besoin de JBoss app server pour fonctionner) ou EhCache (qui fournit maintenant un mécanisme de distribution). Vous devrez reconfigurer votre cache travailler de manière distribuée (cela ne fonctionnera pas comme par magie), mais ce sera probablement une meilleure solution qu'un cluster singleton.

1
répondu skaffman 2009-07-28 13:38:00

Je suis D'accord avec M. Vest Hansen sur ce point, éloignez-vous le plus possible des Singleton. Après avoir été aux prises avec le cauchemar que sont SAAJ et JAXP et d'obtenir des versions compatibles travaillant sur JBoss, j'en ai fini avec les singletons et les usines. Un message SOAP ne devrait pas avoir besoin d'une usine pour l'instancier.

OK, rant over, qu'en est-il de memcache ou quelque chose de similaire? Quelle sorte d'affinité avez-vous besoin pour votre cache? Est-ce mauvais si jamais il est périmé, ou est-il une certaine souplesse dans la façon de ce jour, les données peuvent obtenir?

1
répondu Chris K 2009-07-28 13:41:43

il y a plusieurs façons de gérer cela, en fonction de 1) Comment les données sont sorties, et 2) est-ce que chaque instance doit avoir les mêmes valeurs tout le temps.

si vous avez juste besoin de données qui sont raisonnablement à la hauteur des données, mais chaque JVM n'a pas besoin d'avoir des données correspondantes, vous pouvez juste avoir chaque JVM rafraîchir ses données sur le même calendrier (par exemple, toutes les 30 secondes).

si le rafraîchissement doit se produire à peu près au même moment, vous pouvez avoir une jvm envoyer un message aux autres en disant "Il est temps de rafraîchir maintenant "

si chaque jvm a toujours besoin des mêmes informations, vous devez faire une synchronisation, où le maître dit" rafraîchir maintenant", toutes les caches bloquent toutes les nouvelles requêtes, rafraîchissent et disent au maître qu'elles sont terminées. Quand le maître reçoit une réponse de chaque membre du cluster, il envoie un autre message qui dit de procéder.

1
répondu KeithB 2009-07-28 13:59:16

je suis confronté à une situation similaire, mais j'utilise WebLogic et cohérence D'Oracle .

je travaille sur une application web qui utilise un hashmap avec des données en cache lues à partir de la base de données (texte à afficher sur les étiquettes webform ). Pour ce faire, les développeurs ont utilisé une instance unique où ils ont stocké toutes ces informations. Cela a bien fonctionné sur un seul serveur environnement, mais maintenant nous voulons aller dans la solution de cluster et je fais face à ce problème avec cette instance unique.

D'après ce que j'ai lu jusqu'à présent, c'est la meilleure solution pour accomplir ce que je veux . J'espère que ça vous aidera aussi avec votre problème.

1
répondu XpiritO 2010-02-25 11:16:00

il existe des produits pour avoir une mémoire cache distribuée (comme memcache) qui peuvent aider dans cette situation.

une meilleure solution, si possible, peut être d'avoir les singletons pas vraiment être unique, mais avoir l'application tolérer avoir des instances séparées (dire que tous reconnaissent quand ils ont besoin d'être rafraîchis) mais pas qu'ils doivent être synchronisés à travers JVMs, qui peuvent transformer votre cache en un goulot d'étranglement.

0
répondu Yishai 2009-07-28 13:59:43