Le client Java RabbitMQ présente les concepts suivants:
Connection
- une connexion à une instance de serveur RabbitMQChannel
- ???- Pool de threads consommateurs - un pool de threads qui consomment les messages des files d'attente du serveur RabbitMQ
- File d'attente - une structure qui contient les messages dans l'ordre FIFO
J'essaie de comprendre la relation et, plus important encore , les associations entre eux.
- Je ne suis toujours pas tout à fait sûr de ce qu'est a
Channel
, à part le fait qu'il s'agit de la structure à partir de laquelle vous publiez et utilisez, et qu'elle est créée à partir d'une connexion ouverte. Si quelqu'un pouvait m'expliquer ce que représente la "chaîne", cela pourrait aider à clarifier certaines choses. - Quelle est la relation entre Channel et Queue? Le même canal peut-il être utilisé pour communiquer avec plusieurs files d'attente, ou doit-il être 1: 1?
- Quelle est la relation entre la file d'attente et le pool de consommateurs? Plusieurs consommateurs peuvent-ils être abonnés à la même file d'attente? Plusieurs files d'attente peuvent-elles être utilisées par le même consommateur? Ou la relation est-elle 1: 1?
Merci d'avance pour toute aide ici!
Réponses:
A
Connection
représente une connexion TCP réelle au courtier de messages, tandis que aChannel
est une connexion virtuelle (connexion AMQP) à 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 des connexions TCP.Vous pouvez en utiliser un
Channel
pour tout. Cependant, si vous avez plusieurs threads, il est suggéré d'utiliser un autreChannel
pour chaque thread.Channel thread-safety dans le guide de l'API du client Java :
Il n'y a pas de relation directe entre
Channel
etQueue
. AChannel
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.Chacun
Consumer
s'exécute dans son propre thread alloué à partir du pool de threads consommateur. Si plusieurs consommateurs sont abonnés à la même file d'attente, le courtier utilise la répétition alternée pour distribuer les messages entre eux de manière égale. Voir le didacticiel 2: "Files d'attente de travail" .Il est également possible d'attacher le même
Consumer
à plusieurs files d'attente. Vous pouvez comprendre les consommateurs comme des rappels. Ceux-ci sont appelés chaque fois qu'un message arrive sur une file d'attente à laquelle le consommateur est lié. Dans le cas du client Java, chaque consommateur a une méthodehandleDelivery(...)
, qui représente la méthode de rappel. En règle générale, vous sousDefaultConsumer
-classez et remplacezhandleDelivery(...)
. Remarque: Si vous attachez la même instance Consumer à plusieurs files d'attente, cette méthode sera appelée par différents threads. Veillez donc à la synchronisation si nécessaire.la source
Une bonne compréhension conceptuelle de ce que fait le protocole AMQP «sous le capot» est utile ici. Je dirais que la documentation et l'API qu'AMQP 0.9.1 a choisi de déployer rendent cela particulièrement déroutant, donc la question elle-même est une question avec laquelle beaucoup de gens doivent se débattre.
TL; DR
Une connexion est le socket TCP physique négocié avec le serveur AMQP. Les clients correctement implémentés en auront un 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 est 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éé en a 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 de pousser les messages d'une file d'attente particulière vers ce point de terminaison de canal.
Faits de connexion
Tout d'abord, comme d'autres l'ont souligné à juste titre, une connexion est l'objet qui représente la connexion TCP réelle au serveur. Les connexions sont spécifiées au niveau du protocole dans AMQP et toutes les communications avec le courtier se font via une ou plusieurs connexions.
Informations sur la chaîne
Un canal est la session d'application qui est ouverte pour chaque élément de votre application pour communiquer avec le courtier RabbitMQ. Il fonctionne sur une seule connexion et représente une session avec le courtier.
Faits sur les consommateurs
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 particulière utilise comme une sorte de «boîte aux lettres» pour déposer des messages.
En ce qui concerne ce que vous entendez par pool de threads grand public, je soupçonne que le client Java fait quelque chose de similaire à ce que j'ai programmé pour mon client (le mien était basé sur le client .Net, mais fortement modifié).
la source
J'ai trouvé cet article qui explique tous les aspects du modèle AMQP, dont le canal en fait partie. J'ai trouvé cela très utile pour compléter ma compréhension
https://www.rabbitmq.com/tutorials/amqp-concepts.html
la source
Il existe une relation entre comme Une connexion TCP peut avoir plusieurs canaux .
Channel : C'est une connexion virtuelle à l'intérieur d'une connexion. Lors de la publication ou de la consommation de messages à partir d'une file d'attente, tout se fait sur un canal alors que la connexion : il s'agit d'une connexion TCP entre votre application et le courtier RabbitMQ.
Dans l'architecture multi-threading, vous pouvez avoir besoin d'une connexion distincte par thread. Cela peut conduire à une sous-utilisation de la connexion TCP, et cela ajoute également une surcharge au système d'exploitation pour établir autant de connexions TCP dont il a besoin pendant la période de pointe du réseau. Les performances du système pourraient être considérablement réduites. C'est là que le canal est utile, il crée des connexions virtuelles à l'intérieur d'une connexion TCP. Cela réduit d'emblée la surcharge du système d'exploitation, et nous permet également d'effectuer des opérations asynchrones de manière plus rapide, fiable et simultanée.
la source