Uniform Distributed Queue et Forward Delay

Bien souvent lorsque l’on souhaite consommer une file JMS, on se retrouve dans un cas simple, où finalement nos consommateurs sont de type MDB. Sur nos serveurs, on se préoccupe peu que cela fonctionne dans les détails, ils se connectent et consomment.
Mais qu’arrive-t-il si l’on se place dans un environnement cluster et que les consommateurs ne sont plus forcément sur notre plateforme ? Voici un cas tout simple : Notre consommateur fonctionne en mode batch et ne présente pas forcément autant de consommateurs que de nœuds de notre cluster. Voyons une solution envisageable…


Présentation du cas

Concrètement vous avez un environnement cluster, et voudriez en conséquent, pouvoir utiliser les files JMS distribuées. Ceci fonctionnera très bien en temps normal : nos consommateurs mettront en place plusieurs consommateurs et se répartiront sur les nœuds du cluster. Les éléments gérés seront envoyés et consommés là où cela est possible.
Les Uniform Distributed Queues vont être de manière générale :

  • Disponibles sur tous les nœuds du cluster
  • Leurs messages seront consommés au fil de l’eau
  • Leurs messages seront mis à disposition en priorité sur les nœuds avec consommateurs
  • Attaquées par des consommateurs qui se répartiront sur les noeuds

Mais finalement un des consommateurs sera en mode batch, avec un unique consommateur. Pour un tel cas on ne souhaiterait pas remettre en cause le reste. L’idéal est donc de trouver un paramétrage qui pourrait permettre de solutionner ce cas.

Forward Delay

Ce paramétrage est à mettre en place sur une file JMS. Il aura pour but de mettre en place un délai d’attente, en secondes, avant transfert des messages vers un autre membre qui lui aurait des consommateurs présents.
Par défaut cet attribut de notre Uniform Distributed Queue est mis à la valeur -1, ce qui signifie qu’aucun délai n’est mis en place pour effectuer ce transfert.
Grâce à cette option, on va activer ce délai, et préciser par exemple que les messages doivent être redirigés après 5s.
A présent, notre consommateur unique sera en capacité de recevoir tous les messages présents sur tous les nœuds du cluster. Pour cela il devra uniquement rester présent un certain délai pour permettre au message d’être redirigés vers son nœud.

Conclusion

Ceci ne présente qu’un petit paramétrage JMS, il en existe bien d’autres : redirection d’erreur, paramétrage des quotas… … comme celui présenté ici certains peuvent avoir un intérêt important.
Pour gérer notre cas nous avons opté pour une solution simple, qui permettra de contourner un certain nombre de cas, sans sacrifier de haute disponibilité. D’autres options auraient pu être envisagées : store and forward, cibles migrables… plus complexes à appréhender, mais qui répondront à d’autres problématiques également !