2015-09-30 1 views
2

J'ai mis en place plusieurs consommateurs, qui récupèrent des messages à partir d'une seule file d'attente, je fais cela en utilisant quelque chose de similaire à this example, sauf que je fais basic.get sur un boucle infinie pour l'interrogation.rabbitmq plusieurs consommateurs sur une file d'attente - un seul reçoit le message

Une idée comment empêcher la course entre tous les consommateurs, en ce sens qu'un seul consommateur recevra le message et l'autre continuera à faire des sondages jusqu'à ce qu'un autre message arrive?
J'essaie de suivre une logique dans laquelle dès que je reçois le message je l'ack pour le message à supprimer, mais il semble que d'autres files d'attente, parviennent à obtenir le message avant que le premier a accusé et supprimé le message . Alors tout le monde a compris ce message.

Merci à l'avance

+0

Comment publiez-vous le message dans la file d'attente? Comment le consommez-vous? Est-ce que je comprends bien que tous vos clients reçoivent le message, et pas seulement un, mais que vous voulez qu'un seul client le reçoive? Ou est-ce qu'un seul client reçoit le message et que vous voulez que tout le monde le reçoive? – MatsLindh

+0

Publier avec channel.basic_publish -direct avec la clé de routage en utilisant basic_get, exactement comme dans l'exemple ci-dessus – JavaSa

+1

Tous mes consommateurs reçoivent le message, et je veux que le premier qui l'a obtenu le traite, et qu'un seul consommateur obtienne chaque message de la file d'attente, celui qui est disponible – JavaSa

Répondre

3

Toute idée comment empêcher la course entre tous les consommateurs, en ce que seul un consommateur recevra le message et l'autre continuera de le faire jusqu'à ce vote un autre message est?

vous ne pouvez pas, la façon dont vous avez les choses mises en place. RabbitMQ va arrondir les messages aux consommateurs, mais un seul consommateur recevra le message de la file d'attente. C'est par conception dans RabbitMQ, lorsque vous avez plusieurs consommateurs sur une seule file d'attente.

Si vous avez besoin que tous les consommateurs reçoivent tous les messages, vous devez modifier votre configuration pour que chaque client dispose de sa propre file d'attente. Ensuite, vous devez publier votre message via un échange qui transmettra le message à toutes les files d'attente pour tous les consommateurs.

La méthode la plus simple consiste à utiliser un type d'échange Fanout.

+3

"mais un seul consommateur recevra le message de la file d'attente" c'est exactement ce que je veux, et cela ne s'est pas produit. Quoi qu'il en soit, j'ai ajouté 'channel.basiq_qos (prefetch_count = 1)' et maintenant il semble qu'un seul consommateur reçoive le message et pas tous – JavaSa

+0

Réglage 'prefetch_count' à' 1' sur un canal et ayant plusieurs consommateurs sur ce canal avec ' auto_ack' éteint fera l'affaire. Un seul consommateur actif tiendra un message tandis que d'autres seront en attente. Notez que cela ne fonctionne que lorsque les consommateurs sont sur le même canal. Mais si elles sont sur le même canal et que vous avez besoin d'un message de processus seulement par un consommateur à la fois, je suppose qu'il est logique de lancer un seul consommateur. Regardez aussi le paramètre 'exclusive' de la file d'attente, dans certaines situations, cela peut être une solution. – pinepain

+0

@ zaq178miami: Je suis un peu confus, le problème est que, j'ai 2 files d'attente et plusieurs consommateurs sur chaque file d'attente, je veux que lorsque le message arrive à la file d'attente X -> seulement un des consommateurs actifs prendra le message, va continuer à attendre, jusqu'au prochain message bien sûr, puis la même histoire – JavaSa