2016-12-29 1 views
1

Nous avons une application déployée sur prod dans un environnement multicluster, avec un équilibreur de charge.Avis sur le modèle d'abonné Jms publish

Dans l'application, nous conservons un cache pour améliorer les performances. Le problème est que, comme nous sommes dans un environnement multicluster, un singleton n'est pas vraiment un singleton, donc si nous effaçons le cache dans un nœud, l'autre nœud n'est pas averti pour nettoyer son propre cache.

Nous avons actuellement seulement deux nœuds mais nous pourrions en ajouter d'autres dans le futur. Donc, ma première pensée était d'implémenter une file d'attente JMS avec le modèle publish/abonné. Une fois qu'un nœud a besoin de vider son cache, il enverrait un message à la file d'attente, et tous les nœuds (même lui-même) devraient être notifiés automatiquement pour effacer leurs caches. J'ai vérifié avec activemq, mais pour autant que j'ai vu, une fois que l'éditeur envoie un message, l'abonné doit faire getMessage() pour recevoir le message. Cela impliquerait que nous devrions continuellement tirer la file d'attente pour voir s'il y a un message là-bas, et aussi je devrais m'assurer qu'une fois que tous les abonnés ont lu le message, le message est enlevé. J'écris juste pour obtenir des conseils sur la façon de mettre en œuvre une telle chose, si activemq ou toute autre implémentation jms fournit quelque chose qui correspondrait à nos besoins.

Merci

Répondre

1

Ce scénario est assez simple avec tous les fournisseurs JMS, y compris ActiveMQ.

Il suffit de publier un message sur un sujet, disons CLEAR.CACHE. Ensuite, chaque nœud doit se connecter avec un ID client unique à ce nœud (le même ID même après un redémarrage, vous devez donc récupérer cet ID à partir de l'environnement/configuration - pas de code).

Chaque noeud est alors capable de créer un abonné durable à la rubrique CLEAR.CACHE. Une copie sera envoyée à chaque nœud - même si le nœud est hors ligne pendant la publication.

Quelques documents officiels: https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

Je voulais juste dire qu'il existe des solutions complètes de cache distribuées à utiliser aussi bien, vous ne devez pas traiter manuellement avec ce genre de choses. Redis, hazlecast etc .. Mais si tout ce que vous voulez est une commande de base "effacer le cache" entre les nœuds (ou tout autre type de commande à distribuer entre les nœuds), alors JMS est le chemin à parcourir.

+0

Super, merci! – fgonzalez