Question

J'ai plusieurs serveurs qui produisent des fichiers XML à partir de Python et d'autres serveurs qui utilisent ces XML en utilisant Java. Récemment, je me suis penché sur JMS et ActiveMQ et j'ai décidé de l'utiliser pour transmettre les fichiers xml.

J'ai donc configuré les démons ActiveMQ sur les serveurs grand public et décidé d'implémenter une méthode de cycle sur les produits afin de distribuer les xml de manière uniforme entre les consommateurs.

Python  -----------------------------> ActiveMQ ---> Java
        \                           /
         \                         /
          ---------------------------> ActiveMQ ---> Java
                                 /  /
Python  ----------------------------

Pour les tests, j'ai dirigé un producteur et un consommateur et examiné les résultats.

À ma grande surprise, les messages du producteur ont été distribués sur tous les serveurs ActiveMQ du réseau. Comme je n’utilisais qu’un seul consommateur, il ne recevait que les fichiers xml envoyés au démon ActiveMQ sur cette machine, et le reste des fichiers xml attendaient patiemment sur les autres démons ActiveMQ sur d’autres machines.

Python  -----------------------------> ActiveMQ ---> Java (work)
                                          |
                                          |
                                       ActiveMQ (xmls piling up)

EDIT: Ce n’est pas ce qui s’est réellement passé, désolé. Voir ci-dessous pour plus de détails

Maintenant, je ne me plains pas, puisque c'est ce que je voulais quand même, mais je suis un peu confus: quelle est la bonne façon de mettre en œuvre cette file d'attente multiple à plusieurs que je suis après?

Devrais-je également configurer les démons ActiveMQ sur mes machines de production, envoyer les xml aux ActiveMQs de l'hôte local et faire confiance à la découverte automatique pour obtenir les xml aux consommateurs?

Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
                |                                      |
                |                                      |
                |                                -- ActiveMQ ---> Java
                |                               |  
Python ---> ActiveMQ----------------------------

Devrais-je m'en tenir à mon plan initial et passer les messages en revue sur les machines grand public, par sécurité?

Ou y a-t-il une API à utiliser qui masque ces détails à mes processus?

En passant, les producteurs sont des processus python utilisant STOMP et les consommateurs utilisent Java en utilisant JMS.

Je m'excuse si vos yeux me font mal à cause de mon art de merde ASCII, je n'étais pas sûr de savoir si je suis assez clair avec juste des mots.

EDIT

Apparemment, quand j’exécutais "un producteur et un consommateur", Je n'ai pas remarqué que les autres consommateurs couraient déjà. Ils ne faisaient tout simplement rien d’utile avec les XML traités. C'est pourquoi je voyais des résultats partiels.

Après avoir lu un peu plus et expérimenté un peu, j'ai compris ce qui suit:

Par défaut, ActiveMQ détecte automatiquement les autres instances ActiveMQ sur le réseau local et crée une fonction de stockage et de transfert réseau de courtiers . Cela signifie que le producteur peut publier le fichier XML sur toute instance ActiveMQ et il trouvera facilement le moyen de répondre aux consommateurs qui écoutent d'autres instances ActiveMQ sur le même réseau.

Notez que la documentation affirme que la découverte automatique n'est pas recommandée pour les installations de production.

La réponse acceptée ci-dessous reste valable, cependant. Le moyen le plus simple d’utiliser ActiveMQ consiste simplement à utiliser un ou deux serveurs en tant que "Serveurs de file d’attente". Néanmoins, j’ai choisi d’aller avec mon plan initial, car je pensais que cela réduirait le trafic réseau (avec un serveur intermédiaire, les xml doivent rentrer et sortir à nouveau).

Était-ce utile?

La solution

Itsadok, je pense que vous n'envisagez probablement pas d'utiliser la messagerie correctement.

Le fait de disposer d’une instance MOM (qu’il s’agisse d’ActiveMQ, de RabbitMQ ou de tout autre courtier MOM) sur un cas individuel par consommateur n’a pas vraiment de sens sur le plan conceptuel. Il est préférable de considérer votre courtier MOM comme un routeur de messages.

Dans ce cas, vous disposez d'une instance de courtier ActiveMQ (qui peut être partagée ou redimensionnée si vous rencontrez des problèmes de dimensionnement ou répliquée si vous avez des considérations relatives à la haute disponibilité) à laquelle tous les producteurs et tous les consommateurs se connectent. Ensuite, tout le XML passe à la même instance de courtier et tous les consommateurs lisent à partir de la même instance de courtier. Dans ce cas, le courtier déterminera le consommateur auquel le message doit être envoyé en fonction des heuristiques utilisées.

Cela signifie également que vous pouvez ajouter et supprimer des producteurs et des consommateurs de manière dynamique, et que rien ne change jamais: ils se connectent tous aux mêmes courtiers. Vous pouvez donc ajouter et supprimer des producteurs et des consommateurs lorsque votre charge change ou que vos systèmes échouent.

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