web-dev-qa-db-fra.com

Existe-t-il une différence de performance entre la mise en commun des connexions ou des canaux dans rabbitmq?

Je suis un débutant avec Rabbitmq (et la programmation) donc désolé d'avance si cela est évident. Je crée un pool à partager entre les threads travaillant sur une file d'attente, mais je ne suis pas sûr de devoir utiliser des connexions ou des canaux dans le pool. 

Je sais que j'ai besoin de canaux pour faire le travail réel, mais y a-t-il un avantage en termes de performances d'avoir un canal par connexion (en termes de plus débit de la file d'attente)? ou suis-je préférable d'utiliser une seule connexion par application et de regrouper plusieurs canaux?

remarque: étant donné que je regroupe les ressources, le coût initial n’est pas un facteur, car les connexions coûtent plus cher que les canaux. Je suis plus intéressé par le débit.

54
Lostsoul

J'ai trouvé ceci sur le site Web rabbitmq , il se trouve près du bas, j'ai donc cité la partie pertinente ci-dessous. 

La version tl; dr est que vous devez avoir 1 connexion par application et 1 canal par thread. J'espère que cela pourra aider.

Les liaisons

Les connexions AMQP ont généralement une longue durée de vie. AMQP est une application protocole de niveau qui utilise TCP pour une livraison fiable. Connexions AMQP utiliser l'authentification et peut être protégé à l'aide de TLS (SSL). Quand un L’application n’a plus besoin d’être connectée à un courtier AMQP, il devrait normalement fermer la connexion AMQP au lieu d’être brusquement fermer la connexion TCP sous-jacente.

Canaux

Certaines applications nécessitent plusieurs connexions à un courtier AMQP . Cependant, il n’est pas souhaitable de garder de nombreuses connexions TCP ouvertes au même temps car cela consomme des ressources système et le rend plus difficile à configurer les pare-feu. Les connexions AMQP 0-9-1 sont multiplexé avec des canaux qui peuvent être considérés comme des "connexions légères partageant une seule connexion TCP".

Pour les applications utilisant plusieurs threads/processus pour le traitement, il est très courant d'ouvrir un nouveau canal par thread/processus et non partager des canaux entre eux.

La communication sur un canal particulier est complètement séparée de communication sur un autre canal, donc chaque méthode AMQP également porte un numéro de canal que les clients utilisent pour déterminer quel canal la méthode est pour (et donc, quel gestionnaire d'événement doit être appelé, par exemple).

Il est conseillé d’avoir 1 canal par thread, même s’ils sont thread-safe, vous pouvez donc avoir plusieurs threads qui envoient par le même canal. En ce qui concerne votre application, je vous conseillerais cependant de vous en tenir à un canal par thread.

De plus, il est conseillé de n'avoir qu'un seul consommateur par canal.

Ce ne sont que des directives, vous devrez donc faire des tests pour voir ce qui vous convient le mieux.

Ce fil a quelques idées ici et ici .

En dépit de toutes ces directives, cet article suggère que les connexions multiples n’auront probablement aucune incidence sur les performances. Bien qu'il ne soit pas spécifique de savoir s'il s'agit du côté client ou du côté serveur (rabbitmq). Avec le seul point qu'il faudra bien sûr utiliser plus de ressources systèmes avec plus de connexions. Si cela ne pose pas de problème et que vous souhaitez augmenter le débit, il peut être préférable d’avoir plusieurs connexions, car this post suggère que plusieurs connexions vous permettront d’obtenir davantage de débit. La raison semble être que, même s'il y a plusieurs canaux, un seul message passe par la connexion à la fois. Par conséquent, un message volumineux bloquera toute la connexion ou de nombreux messages sans importance sur un canal pourraient bloquer un message important sur la même connexion mais sur un autre canal. Encore une fois, les ressources sont un problème. Si vous utilisez toute la bande passante avec une seule connexion, l'ajout d'une connexion supplémentaire n'augmentera pas les performances si vous disposiez de deux canaux sur la même connexion. De plus, chaque connexion utilisera plus de mémoire, de processeurs et de descripteurs de fichiers, mais cela pourrait ne pas être un problème, bien que cela puisse être un problème lors de la mise à l'échelle.

76
robthewolf

En plus de la réponse acceptée:

Si vous avez un groupe de nœuds RabbitMQ avec soit un équilibreur de charge, soit un DNS de courte durée (permettant de se connecter à un nœud de lapin différent à chaque fois), une seule connexion de longue durée signifie Le nœud d'application fonctionne exclusivement avec un seul nœud RabbitMQ. Cela peut amener un nœud RabbitMQ à être plus utilisé que les autres. 

L'autre préoccupation mentionnée ci-dessus est que la publication et la consommation sont des opérations de blocage, ce qui conduit à la mise en file d'attente des messages. Avoir plus de connexions garantira que 1. le temps de traitement de chaque message ne bloque pas les autres messages. 2. Les gros messages ne bloquent pas les autres messages.

C’est pourquoi il est utile d’envisager de créer un petit groupe de connexions (en tenant compte des problèmes de ressources évoqués ci-dessus).

14
Bozho

Le "un canal par fil" pourrait être une hypothèse sûre (je dirais que je pourrais ne pas faire de recherche par moi-même et que je n'ai aucune raison de douter de la documentation :)), mais méfiez-vous du fait qu'il y a un cas où cela casse:

Si vous utilisez RPC avec RabbitMQ Réponse directe à , vous ne pouvez pas réutiliser le canal identique à consommer pour la demande autre RPC. J'ai demandé des détails à ce sujet dans le groupe d'utilisateurs google et la réponse de Michael Klishin (qui semble participer activement au développement de RabbitMQ) a été que

La réponse directe à n'est pas destinée à être utilisée avec le partage de canal de toute façon.

J'ai envoyé un email à Pivotal pour mettre à jour leur documentation afin d'expliquer commentamq.rabbitmq.reply-to fonctionne sous le capot et j'attends toujours une réponse (ou une mise à jour).

Donc, si vous voulez vous en tenir à "un canal par fil", méfiez-vous, cela ne fonctionnera pas bien avec la réponse directe à.

0