Comment préserver l'ordre des messages lors de la consommation de messages d'ActiveMQ?

StackOverflow https://stackoverflow.com/questions/426532

  •  06-07-2019
  •  | 
  •  

Question

J'ai un service .NET qui utilise le client ActiveMQ. J'ai implémenté un MessageListener avec une connexion en transaction pour consommer les messages.

Parfois, je reçois des messages dans un ordre différent de leur mise en file d'attente.

Était-ce une erreur d'utiliser un MessageListner? Existe-t-il un moyen de préserver l'ordre des messages?

À titre d'information: un producteur place des messages dans la file d'attente et un autre consommateur les extrait de la file d'attente.

Était-ce utile?

La solution 2

Plus d'infos: le serveur que j'appelle est un tiers et je n'ai aucun contrôle sur les messages qu'il envoie. Je sais, en fonction des ID de message, qu'ils sont placés dans le bon ordre. De plus, dans ce système, il existe une différence entre ACK et Acknowledge. L'accusé de réception est reçu lorsque mon message d'origine est placé sur le message "sortant". queue. Je surveille ensuite un " inbound " file d'attente pour les réponses. Je reçois généralement un "Acknowledge". suivi d'un " Pass " ou un "échec". L'ID de corrélation de ces messages est l'ID de message de l'ACK.

À l'origine, j'avais utilisé un écouteur de message et répondu à un événement OnMessge. J'ai abandonné cette approche après avoir réalisé que, grâce à cette méthode, les messages sont remis de manière asynchrone et donc sans ordre particulier. Ainsi, j'ai changé mon code pour qu'il appelle poll à l'aide d'un minuteur (System.Threading.Timer) pour appeler consumer.Receive () et obtenir un message à la fois. Cela fonctionne comme je veux.

J'ouvre le consommateur une fois au démarrage du service et je recherche continuellement des messages.

Autres conseils

Vous ne devriez rien faire pour maintenir l'ordre. c'est l'une des choses qu'une file d'attente de messages fait pour vous. Je pense que si un seul consommateur écoute la file d'attente et que celle-ci traite les messages dans le désordre, alors vous avez soit trouvé un bogue, soit les messages ne sont pas mis en file d'attente dans l'ordre que vous pensez être.

De plus, cette question de la FAQ ActiveMQ qui pourrait vous aider.

Modifier: à la lecture des commentaires sur La réponse de duffymo , on dirait que vous êtes un peu trop en ingénierie. En règle générale, une file d'attente de messages telle qu'ActiveMQ, MQ Series, joram, etc. présente deux caractéristiques: elles délivrent les messages dans le même ordre dans lequel elles sont mises en file d'attente et garantissent la livraison des messages. L'envoi d'un message ACK distinct est redondant; c'est un peu comme valider une transaction de base de données, puis interroger les mêmes informations pour vérifier que la base de données les a effectivement stockées.

Ceci dit, votre serveur est-il multithread? Si tel est le cas, il peut éventuellement mettre en file d'attente la réponse avant de mettre l'ACK en file d'attente.

Pourquoi l’ordre des messages est-il important? Un MessageListener ne devrait pas avoir à s'en soucier.

Si vous avez besoin d'un identifiant de corrélation pour faire correspondre une réponse à une demande particulière, c'est une autre affaire. Est-ce ce que vous voulez dire?

Tout ce que Jason vient de dire. Quelques autres choses à faire attention. Vous gardez le consommateur ouvert pour beaucoup de messages, n'est-ce pas? Vous ne créez pas un consommateur pour quelques messages, puis le fermez? Seule la fermeture d’un consommateur entraîne la réinsertion des messages associés à un consommateur, ce qui peut rompre l’ordre.

Est-ce lié aux annulations? (Annulez-vous des transactions?).

Enfin, vous pouvez toujours garantir l'ordre en utilisant un Resequencer pour réorganiser les commandes pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top