Le client RabbitMQ Java présente les concepts suivants:
Connection
- une connexion à une instance de serveur RabbitMQChannel
- ???J'essaie de comprendre la relation, et plus important encore , les associations entre eux.
Channel
, mis à part le fait qu'il s'agit de la structure à partir de laquelle vous publiez et que vous utilisez, et qu'elle est créée à partir d'une connexion ouverte. Si quelqu'un pouvait m'expliquer ce que représente le "canal", cela pourrait aider à clarifier certaines choses.Merci d'avance pour toute aide ici!
Un Connection
représente une réelle connexion TCP au courtier de messages, alors qu'un Channel
est une connexion virtuelle (connexion AMPQ) à l'intérieur. De cette façon, vous pouvez utiliser autant de connexions (virtuelles) que vous le souhaitez dans votre application sans surcharger le courtier avec TCP connexions.
Vous pouvez utiliser un Channel
pour tout. Cependant, si vous avez plusieurs threads, il est suggéré d'utiliser un Channel
différent pour chaque thread.
Chaîne thread-safety dans Java Guide de l'API client :
Les instances de canal peuvent être utilisées par plusieurs threads en toute sécurité. Les demandes dans un canal sont sérialisées, un seul thread pouvant exécuter une commande sur le canal à la fois. Même dans ce cas, les applications doivent préférer utiliser un canal par thread au lieu de partager le même canal sur plusieurs threads.
Il n'y a pas de relation directe entre Channel
et Queue
. Un Channel
est utilisé pour envoyer des commandes AMQP au courtier. Cela peut être la création d'une file d'attente ou similaire, mais ces concepts ne sont pas liés.
Chaque Consumer
s'exécute dans son propre thread alloué à partir du pool de threads grand public. Si plusieurs consommateurs sont abonnés à la même file d'attente, le courtier utilise la méthode alternée pour répartir les messages de manière égale. Voir Didacticiel deux: "Files d'attente" .
Il est également possible d'associer le même Consumer
à plusieurs files d'attente. Vous pouvez comprendre les consommateurs comme des rappels. Celles-ci sont appelées à chaque fois qu'un message arrive dans une file d'attente à laquelle le consommateur est lié. Dans le cas du client Java, chaque consommateur dispose d'une méthode handleDelivery(...)
, qui représente la méthode de rappel. Ce que vous faites généralement est la sous-classe DefaultConsumer
et le remplacement de handleDelivery(...)
. Remarque: Si vous associez la même instance de consommateur à plusieurs files d'attente, cette méthode sera appelée par différents threads. Donc, prenez soin de la synchronisation si nécessaire.
Une bonne compréhension conceptuelle de ce que le protocole AMQP fait "sous le capot" est utile ici. Je proposerais que la documentation et l'API qu'AMQP 0.9.1 a choisi de déployer rend cette situation particulièrement déroutante. La question elle-même est donc une question à laquelle de nombreuses personnes doivent faire face.
TL; DR
Un connexion est le socket physique négocié TCP avec le serveur AMQP. Les clients correctement implémentés auront un de ceux-ci par application, thread-safe, partageable entre les threads.
Un canal est une session d'application unique sur la connexion. Un fil aura une ou plusieurs de ces sessions. L’architecture AMQP 0.9.1 stipule que ceux-ci ne doivent pas être partagés entre les threads et doivent être fermés/détruits lorsque le thread qui l’a créé est terminé. Ils sont également fermés par le serveur lorsque diverses violations de protocole se produisent.
Un consommateur est une construction virtuelle qui représente la présence d'une "boîte aux lettres" sur un canal particulier. L'utilisation d'un consommateur indique au courtier d'envoyer les messages d'une file d'attente particulière au point de terminaison de ce canal.
Faits de connexion
Tout d’abord, comme d’autres l'ont bien fait remarquer, une connexion est l'objet qui représente la connexion réelle TCP au serveur. Les connexions sont spécifiées au niveau du protocole dans AMQP et toutes les communications avec le courtier s'effectuent via une ou plusieurs connexions.
Faits concernant la chaîne
Un canal est la session de l'application ouverte pour que chaque élément de votre application puisse communiquer avec le courtier RabbitMQ. Il fonctionne sur un seul connexion et représente une session avec le courtier.
Renseignements sur le consommateur
Un consommateur est un objet défini par le protocole AMQP. Ce n'est ni un canal, ni une connexion, mais plutôt quelque chose que votre application utilise comme "boîte aux lettres" pour supprimer des messages.
En ce qui concerne ce que vous entendez par pool de threads de consommation, je soupçonne que Java client effectue quelque chose de similaire à ce que j'ai programmé pour mon client (le mien était basé sur le client .Net, mais fortement modifié).
J'ai trouvé cet article qui explique tous les aspects du modèle AMQP, dont canal est l'un. J'ai trouvé cela très utile pour compléter ma compréhension
https://www.rabbitmq.com/tutorials/amqp-concepts.html
Certaines applications nécessitent plusieurs connexions à un courtier AMQP. Cependant, il n'est pas souhaitable de garder plusieurs connexions TCP ouvertes en même temps, car cela consomme des ressources système et complique la configuration du pare-feu. Les connexions AMQP 0-9-1 sont multiplexées avec des canaux que l'on peut qualifier de "connexions légères partageant une seule connexion TCP connexion".
Pour les applications qui utilisent plusieurs threads/processus pour le traitement, il est très courant d'ouvrir un nouveau canal par thread/processus et de ne pas partager les canaux entre eux.
La communication sur un canal particulier est complètement séparée de la communication sur un autre canal. Par conséquent, chaque méthode AMQP porte également un numéro de canal que les clients utilisent pour déterminer le canal auquel la méthode est destinée (et par conséquent, le gestionnaire d'événement devant être appelé, par exemple). .