6
votes

Comment garantir une livraison fiable JMS

Je pense que beaucoup d'applications (printemps dans mes cas) à l'aide de JMS peuvent suivre ce flux de travail:

Database A ===> Producer ===> JMS Queue ===> Consumer ===> Database B


0 commentaires

3 Réponses :


2
votes

1) de mon expérience avec les gestionnaires de file d'attente (série MQ, ActiveMQ et HornetQ) Je n'ai jamais eu besoin de ce type de reconnaissance entre producteur / consommateur. De plus, l'environnement que j'ai utilisé pour faire face, le trafic était d'environ 50/60 millions par jour d'objets sur plusieurs files d'attente. Et les files d'attente sont également persistées.

2) Dans mon cas, l'utilisation du mécanisme de persistance sur la file d'attente était totalement suffisante pour gérer un scénario d'électricité. J'ai utilisé la persistance du disque sur la série MQ et Hornetq.

Cependant, parfois à ACK, la quantité de messages, nous avons développé certains mécanismes pour comparer la base de données A avec la base de données B, pour être sûr que les messages ont également été consommés. Je ne sais pas si l'architecture JMS devrait fournir ce type de mécanisme, car une telle tâche pourrait diminuer la performance.

C'est quelque chose - à mon point de vue - que vous devez mesurer sur votre architecture système à quel point il est important de faire correspondre ces informations, car ce n'est pas si facile à conserver.

Cordialement.



1
votes

Si je comprends votre question, cela semble être un cas pour les transactions JTA / XA (tant que vos fournisseurs de DB / JMS les soutiennent). Les gestionnaires de Spring TX peuvent vous aider à faire de la gestion TX (plus) fournisseur agnostique.

FYI, j'utilise Apache Camel pour ce type de débit qui a une très bonne manipulation d'erreurs à travers les producteurs / consommateurs.


3 commentaires

JTA signifie API de transaction Java, il s'agit simplement d'une JSR sur la gestion des transactions dans Java et le support des fournisseurs de RDBMS / MQ ne sont pas pertinents. Je suppose que vous vouliez dire XA (transaction distribuée de plusieurs ressources) Notez que JMS est également une JMS EE JSR et que toute mise en œuvre est donc conforme à XA (sinon, ils ne fournissent pas de mise en œuvre JMS, mais une simple messagerie simple)


De plus, la transaction n'est jamais distribuée sur des limites de maman (producteur et consommateur) car elle est conflictuelle avec la nature asynchrone de la messagerie des mamans. La production d'un message peut être transactionnelle et consommer également, mais elles ne feront jamais partie de la même transaction.


Oui, JTA / XA, merci. Je pense que nous avons différentes définitions de maman. Certains (comme ActiveMQ) implémentent l'API JMS et prennent en charge les transactions XA, mais certaines (comme la rabbbitmq) ne mettent pas en œuvre l'API JMS et ne prennent pas en charge les transactions globales. Bien sûr, beaucoup de conducteurs DBS (et DB) ne soutiennent pas XA. Mon point était qu'une transaction globale devrait être en mesure de laisser le producteur savoir que le consommateur était / n'a pas réussi (et que le gestionnaire Spring TX peut aider).



4
votes

JMS garantit la livraison du message par nature, si le message est affiché, il sera livré à un consommateur s'il y en a un, tout ce qui se produit, la mère est conçue pour assurer ce fait. Quoi qu'il en soit, livré ne signifie pas nécessairement traité.

La fiabilité est assurée par divers mécanismes:


0 commentaires