RabbitMQ / AMQP: seule file d'attente, plusieurs consommateurs pour le même message?
Je commence tout juste à utiliser RabbitMQ et AMQP en général.
- J'ai une file d'attente de messages
- J'ai plusieurs consommateurs, qui je voudrais faire des choses différentes avec la même message.
La plupart des RabbitMQ documentation semble focalisée sur les round-robin", c'est à dire où un seul message est consommé par un consommateur unique, avec la charge étant réparti entre chaque consommateur. C'est en effet le comportement je suis témoin.
Un exemple: le producteur a une seule file d'attente et envoyer des messages à toutes les 2 sec:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
var count = 1;
connection.on('ready', function () {
var sendMessage = function(connection, queue_name, payload) {
var encoded_payload = JSON.stringify(payload);
connection.publish(queue_name, encoded_payload);
}
setInterval( function() {
var test_message = 'TEST '+count
sendMessage(connection, "my_queue_name", test_message)
count += 1;
}, 2000)
})
Et voici un consommateur:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
connection.on('ready', function () {
connection.queue("my_queue_name", function(queue){
queue.bind('#');
queue.subscribe(function (message) {
var encoded_payload = unescape(message.data)
var payload = JSON.parse(encoded_payload)
console.log('Recieved a message:')
console.log(payload)
})
})
})
Si je commence le consommateur à deux reprises, je peux voir que chaque consommateur est de consommer des messages alternatifs en round-robin comportement. Par exemple, je vais voir les messages 1, 3, 5 dans un terminal, 2, 4, 6 dans l'autre.
Ma question est:
-
Puis-je avoir chaque consommateur de recevoir les mêmes messages? C'est à dire, à la fois les consommateurs à avoir de message 1, 2, 3, 4, 5, 6? Qu'est-ce qui est appelé dans AMQP/RabbitMQ parler? Comment est-il configuré?
-
Est de ce fait souvent? Dois-je juste l'échange de router le message en deux files d'attente, avec un seul consommateur, à la place?
- Je ne suis pas RabbitMQ expert. Cependant, ce que vous avez maintenant est appelé file d'attente, mais ce que vous voulez, c'est des sujets, voir ce tutoriel: rabbitmq.com/tutorials/tutorial-five-python.html, de plus en plus sur les files d'attente vs sujets: msdn.microsoft.com/en-us/library/windowsazure/hh367516.aspx
- Je crois qu'il veut sortance en fait si les sujets de travail aussi bien et va donner plus de contrôle, plus tard.
- Merci @UrbanEsc. Sujets semble résoudre le problème en ayant un message frapper plusieurs files d'attente, et donc être consommée par chacun des files d'attente des consommateurs. Qui penche de plus en plus loin vers la file d'attente de plusieurs/consommateur scénario pour mon cas particulier.
- Pour 2018 (et même pour 2016 et au plus tôt), la réponse est d'utiliser quelque chose comme Kafka, de l'OMI.
Vous devez vous connecter pour publier un commentaire.
Puis-je avoir chaque consommateur de recevoir les mêmes messages? C'est à dire, à la fois les consommateurs à avoir de message 1, 2, 3, 4, 5, 6? Qu'est-ce qui est appelé dans AMQP/RabbitMQ parler? Comment est-il configuré?
Non, si les consommateurs sont sur la même file d'attente. De RabbitMQ est AMQP Concepts guide:
Cela semble impliquer que round-robin comportement au sein d'une file d'attente est un, et ne sont pas configurables. C'est à dire, des files d'attente sont nécessaires afin d'avoir le même message d'ID d'être manipulé par plusieurs consommateurs.
Est de ce fait souvent? Dois-je juste l'échange de router le message en deux files d'attente, avec un seul consommateur, à la place?
Non ce n'est pas, seule file d'attente/plusieurs consommateurs avec chaque chaque consommateur de la manipulation de la même ID de message n'est pas possible. Avoir l'échange de router le message sur deux files d'attente est en effet mieux.
Que je n'ai pas besoin de trop complexe de routage, un sortance échange va gérer ce bien. Je n'ai pas trop se concentrer sur les Échanges plus tôt en tant que nœud-amqp est le concept d'un " défaut d'échange vous permettant de publier des messages à une connexion directement, cependant, la plupart des AMQP messages sont publiés à un échange spécifique.
Voici mon sortance échange, l'envoi et de la réception:
int prefetchCount = 1; channel.basicQos(prefetchCount);
Cela permettra à chacun des consommateurs pour recevoir un message dès que c'est fini avec la précédente. Au lieu de recevoir une alternance de messages. Encore ne résout pas votre problème, mais pourrait être utile pour les gens de savoir. exemple ici http://www.rabbitmq.com/tutorials/tutorial-two-java.html à des conditions Équitables de répartitionViens de lire le rabbitmq tutoriel. Vous publiez un message à l'échange, pas de file d'attente; il est ensuite acheminé vers appropriée des files d'attente. Dans votre cas, vous devez lier les séparer de la file d'attente pour chaque consommateur. De cette façon, ils peuvent consommer des messages de manière totalement indépendante.
Les deux dernières réponses sont presque correct - j'ai des tonnes d'applications qui génèrent des messages qui ont besoin de se retrouver avec les différents consommateurs de sorte que le processus est très simple.
Si vous souhaitez que plusieurs consommateurs pour le même message, effectuez la procédure suivante.
Créer plusieurs files d'attente, une pour chaque application qui est à la réception du message, dans chaque file d'attente de propriétés, de "lier" un routage de la balise avec l'amq.l'échange direct. Changer publiez vous app pour envoyer à l'amq.directe et utiliser le routage-tag (pas une file d'attente). AMQP sera alors de copier le message dans chaque file d'attente avec la même liaison. Fonctionne comme un charme 🙂
Exemple: disons que j'ai une chaîne JSON je génère, je la publie pour le "amq.direct" exchange, en utilisant le routage tag "nouvelle commande", j'ai une file d'attente pour mon order_printer application qui imprime l'ordre, j'ai une file d'attente pour mon système de facturation qui en fera parvenir une copie de la commande et de la facture le client et j'ai un web le système d'archivage où je archiver les commandes pour l'histoire du/des raisons de conformité et j'ai un client interface web où les ordres sont suivis comme d'autres info vient à propos d'une commande.
Donc mon files d'attente sont: order_printer, order_billing, order_archive et order_tracking
Tous ont la liaison tag "nouvelle commande" lié à eux, tous les 4 obtiendrez les données JSON.
C'est un moyen idéal pour envoyer des données sans la publication app connaître ou de se soucier de la réception des apps.
Oui chaque consommateur peut recevoir les mêmes messages. jetez un oeil à
http://www.rabbitmq.com/tutorials/tutorial-three-python.html
http://www.rabbitmq.com/tutorials/tutorial-four-python.html
http://www.rabbitmq.com/tutorials/tutorial-five-python.html
différents moyens pour acheminer les messages. Je sais qu'ils sont pour python et java, mais il est bon de comprendre les principes, de décider ce que vous faites et ensuite trouver comment le faire en JS. Ses sons comme vous voulez faire un simple sortance (tutoriel 3), qui envoie les messages à toutes les files d'attente reliée à l'échange.
La différence avec ce que vous faites et ce que vous voulez faire est essentiellement que vous allez installer et l'échange ou le type de cette distribution. Sortance excahnges envoyer tous les messages à tous connectés les files d'attente. Chaque file d'attente auront un consommateur qui aura accès à tous les messages séparément.
Oui cela se fait couramment, c'est l'une des caractéristiques de toujours déléguée.
L'envoyer motif est un one-to-one relation. Si vous souhaitez l'envoyer à plusieurs destinataires, vous devriez être à l'aide de la pub/sub modèle. Voir http://www.rabbitmq.com/tutorials/tutorial-three-python.html pour plus de détails.
RabbitMQ /AMQP: seule file d'attente, plusieurs consommateurs pour le même message et actualisation de la page.
Pour obtenir le comportement que vous souhaitez, tout simplement consommer chaque consommateur de sa propre file d'attente. Vous aurez à utiliser un non-échange direct de type (sujet, en-tête, distribution) afin de faire passer le message à toutes les files d'attente à la fois.
Comme je l'examen de votre dossier est:
J'ai une file d'attente de messages (votre source pour la réception de messages, permet de le nom il q111)
J'ai plusieurs consommateurs, dont je voudrais faire des choses différentes avec le même message.
Votre problème ici est que 3 messages sont reçus par cette file d'attente, le message 1 est consommé par un consommateur, les autres consommateurs, B et C consomme message 2 et 3. Où que vous soyez dans le besoin d'une configuration où rabbitmq passe sur les mêmes copies de l'ensemble de ces trois messages(1,2,3) à tous les trois les consommateurs connectés (A,B,C) simultanément.
Alors que de nombreuses configurations peuvent être faits en ce sens, un moyen simple est d'utiliser les deux suivantes à l'étape de concept:
Remarque: lors de l'utilisation de ce concept ne consomment pas directement à partir de la source de la file d'attente(q111), comme les messages déjà consommé ne sera pas repoussé à votre Sortance échange.
Si vous pensez que cela n'a pas satisfait à vos besoins... n'hésitez pas à poster vos suggestions 🙂
Il est une option intéressante dans ce scénario, je n'ai pas trouvé de réponses ici.
Vous pouvez Nack les messages avec "requeue" dans l'un des consommateurs pour les traiter dans un autre.
Généralement parlant, il n'est pas une bonne voie, mais il sera peut-être assez bon pour quelqu'un.
https://www.rabbitmq.com/nack.html
Et méfiez-vous des boucles (lorsque toutes les concumers nack+requeue message)!
Si vous arrive d'être en utilisant la amqplib bibliothèque comme je suis, ils ont un pratique exemple de la mise en œuvre de la Publier/Souscrire RabbitMQ tutoriel que vous pouvez trouver à portée de main.
Je pense que vous devriez vérifier l'envoi de vos messages en utilisant le fan-out de l'échangeur. De cette façon, vous willl reçoivent le même message pour les différents consommateurs, sous la table, RabbitMQ est la création de différentes files d'attente pour chacun de ces nouveaux consommateurs/abonnés.
C'est le lien pour voir le tutoriel exemple en javascript
https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html