2017-01-15 1 views
1

J'essaie d'étendre un système de messagerie RabbitMQ. Le système actuel est très simple - le producteur envoie un message à un échange de fanout et le message est géré par plusieurs consommateurs - routage en éventail classique.RabbitMQ Work-Queue pour la messagerie FanOut

J'ai plusieurs consommateurs de différents types (par exemple: un qui imprime à l'écran, un qui se connecte au fichier, un qui enregistre dans la base de données, ...). Mon défi - Je ne sais pas quelle est la meilleure façon d'élargir les consommateurs. Si j'ajoute d'autres consommateurs du même type, j'obtiendrai des doubles journaux ou des doubles entrées dans la base de données. ... (pensez à deux consommateurs de DB consommant à partir du même échange de fanout).

Je suppose que je peux créer un consommateur qui publie dans une file d'attente mais je me demande s'il existe une meilleure solution "intégrée" dans rabbitmq.

merci à l'avance, zf

Répondre

0

Si vous avez besoin à l'échelle des consommateurs afin de consommer plus rapidement tous les messages provenant de l'échange de sortance dont vous avez besoin; consommatrice competive Vous avez donc besoin de plus de consommateurs attachés à la même file d'attente liée à l'échange de fanout.
De cette façon, chaque consommateur consommera un lot de messages indépendamment des autres. Le nombre de messages à l'intérieur du lot est défini à l'aide de la propriété comptage de prélecture (http://www.rabbitmq.com/consumer-prefetch.html).
De cette façon, dans votre cas, vous devriez être en mesure de faire évoluer les consommateurs en évitant les doubles journaux et les doubles entrées dans la base de données.

+0

C'est évident, donc je suppose que je n'étais pas clair ... Je suis désolé. La question est de savoir comment mettre à l'échelle tout en s'assurant que de chaque type de consommateurs, un seul traitera. Si j'ai deux types de consuners, type1 et type2 et je veux que chaque message sera traité par chaque type mais seulement une fois par type. Je peux créer un échange de fanout qui enverra à 2 files d'attente de travail .... Y at-il une autre option? – user7412510

+0

Je ne sais pas si je comprends bien votre demande, mais si vous voulez un échange en éventail avec chaque consommateur avec sa propre file d'attente, il n'y a aucun moyen de s'assurer qu'un seul message est traité par un seul consommateur. La seule façon que je vois qui permet de mettre à l'échelle les consommateurs et de s'assurer qu'un seul d'entre eux consomme un message est d'avoir tous les consommateurs sur une seule file d'attente liée à l'échange (et dans ce cas il peut être direct, pas besoin d'une fanout). Mais, peut-être je ne comprends pas complètement le point, désolé si ma réponse ne vous aide pas beaucoup :-) –

+0

'Je peux créer un échange de fanout qui enverra à 2 files d'attente de travail .... Y at-il une autre option ? '<- Pourquoi? ce modèle fait exactement ce que vous cherchez. Pourquoi avez-vous besoin d'un autre moyen? Je n'ai peut-être pas eu votre problème! – Gabriele