2016-11-15 2 views
0

Problème:messages de process en séquence avec les consommateurs concurrents

  • Je reçois des messages (dire les commandes) sur une file d'attente dans une séquence particulière (FIFO)
  • Je concurrents les consommateurs sur la file d'attente
  • Pour ajouter encore à la complexité, le consommateur pourrait être intéressé par des versions spécifiques uniquement de l'ordre en fonction de son état. (Say version1, la version 2 et Version5)
  • le numéro de version de commande est disponible sur l'ordre, mais ne peut pas être utilisé pour le séquençage depuis mon auditeur pourrait ne pas être intéressé par toutes les versions (Le consommateur pourrait ne s'intéresser qu'aux versions Dites version1, version 2 et version5)

Comment est-ce que je m'assure de traiter les messages dans l'ordre où je les ai reçus?

Répondre

0

Vous ne pouvez pas avec plusieurs consommateurs, du moins pas JMS base. Vous devrez fournir la logique.

Les solutions que je pense à tous sucent parce qu'il prend la beauté de l'intégration asynchrone et essaie de le rendre synchrone. Pour chaque "objet" ou "message" ou "type" auquel est attachée la version, vous pouvez suivre les versions que vous avez reçues et essayer de garantir qu'elles sont traitées dans l'ordre. Si un consommateur les reçoit dans le désordre, le consommateur pourrait juste s'arrêter dans sa voie ou pourrait remettre en file d'attente le message, mais l'une ou l'autre des solutions a quelque chose de méchant.

Si un ensemble fini d'objets est versionné, et que vous voyez peut-être les objets plusieurs fois, vous pouvez utiliser des sélecteurs de message pour garantir qu'un consommateur donné est le seul à voir les messages de cet ID particulier. Si votre fournisseur JMS prend en charge les files d'attente prioritaires, vous pouvez assigner différentes priorités et espérer que cela leur donne dans l'ordre approprié, mais même cela semble avoir une condition de concurrence.

Encore une fois, je vais poser la question: vous utilisez la technologie appropriée?

+0

Merci pour la réponse. Scott J'ai pensé à avoir un stockage distribué pour identifier quelle version nous sommes traités, mais cela ne fonctionnera pas pour identifier le premier événement. (Imaginez la version 1 en cours de traitement par Listener 1 et Version2 en cours de traitement par Listener 2. Nous ne pouvons pas garantir l'ordre, les deux pourraient ne pas trouver un enregistrement quand ils recherchent). Dans notre cas, ce n'est pas non plus un ensemble fini. Nous avons besoin d'une file d'attente pour FIFO et garantie de livraison et d'autres mécanismes de basculement. aimerait entendre vos réflexions sur toute autre technologie qui peut être considéré comme – user7161330

+0

autres que sérialisation par un seul consommateur, ne savent pas qu'il y ait une solution, si vous ne pouvez pas déterminer l'état (c.-à-v2 peut/ne peut pas être le premier événement à traiter, et aucun moyen de vérifier) ​​alors pas sûr qu'il existe une solution viable. Avant même d'essayer de coder, il y a un diagramme d'état que vous devez mettre ensemble ... –