2010-08-17 21 views
2

J'ai un module qui fonctionne de manière autonome dans un JVM (pas de conteneurs) et communique avec d'autres modules via JMS. Mon module est à la fois producteur dans une file d'attente et consommateur dans une file d'attente différente. J'ai donc besoin de mettre ce module en cluster, à la fois pour des raisons de HA et pour des raisons de charge de travail, et je vais probablement utiliser Terracotta + Hibernate pour mettre en cluster mes entités. Actuellement, lorsque mon application démarre, elle lance un thread (via Executors.newSingleThreadExecutor()) qui sert de consommateur (je peux joindre un échantillon de code réel si nécessaire et nécessaire).Clustering de module et JMS

Ce que je compris à la lecture des questions est ici que si je viens de commencer mon module sur N différent JVMs alors N différents abonnés seront créés et chaque message dans la file d'attente arrivera à N abonnés. Ce que je voudrais faire est d'avoir un seul d'entre eux (disons ce qui n'est pas important actuellement) traiter ce message et ainsi, en réalité, je peux traiter N messages à la fois.

Comment cela peut-il/devrait-il être fait? Suis-je loin de la piste?

BTW, j'utilise OpenMQ comme ma mise en œuvre, mais je ne sais pas si cela est pertinent.

Merci pour toute aide

Répondre

1

Un cas classique de gestion des messages dans un environnement en cluster. C'est ce que je ferais.

Utilisez le message de diffusion (basé sur le canal) à la place de la file d'attente. La file d'attente étant utile pour la communication point à point n'est pas très efficace. Définir la validité du message jusqu'au moment où il est consommé par l'un des consommateurs. De cette façon, les autres consommateurs ne verront même pas le message et un seul consommateur le consommera.

+0

Salut Tushar, merci pour votre aide. Qu'est-ce que 'Broadcast message'? Est-ce un type différent de message qui est envoyé sur une file d'attente JMS? Qu'avez-vous voulu dire par: "La file d'attente est utile pour la communication point à point n'est pas très efficace"? Merci – Ittai

+0

Je voulais dire utiliser une communication basée sur des sujets à la place de la communication par file d'attente où vous devrez spécifier une destination en passant le message ou devrez implémenter une sorte de logique de routage pour acheminer le message à un consommateur spécifique. Critères. –

+0

Salut Tushar, j'ai lu un peu sur Topic vs. File d'attente et vos solutions semblent excellentes. La seule chose que je n'ai pas comprise concerne le "Définir la validité du message ..." Pourquoi ai-je besoin de définir sa validité? Ne sera-t-il pas consommé par un consommateur par définition du mécanisme Topic? Ittai – Ittai

0

Jetez un oeil à JGroups. Vous pouvez envisager d'implémenter votre module/vos abonnés pour utiliser jgroups pour le type de synchronisation dont vous avez besoin. JGroups fournit une communication multicast fiable.