有选择地与rabbitmq中的工作者共享一个msg

时间:2015-02-19 05:23:01

标签: python rabbitmq rabbitmq-exchange

我想定义一个队列,以便所有发送给它的消息都被路由到不同的worker,同时专门与其中一个worker共享 我想图表可以更好地解释

W(i) - 接收不同信息的工作者

W(sp) - 是接收所有消息的特殊工作者

Q - 队列

“--------------------------------------- Q ------ -------------------

| --------------------------- | ------------------ ---------- |
 | --------------------------- | --------------------- ------- |
W1,W(SP)------------- W2,W(SP)----------- W3,W(SP)

正如你所看到的那样,W1,W2,W3,W4都是不同的工作者,每个人都接受像普通工人一样的不同信息。每个人都会从队列中收到一份工作

然而,每个消息应该像交换W(sp)一样共享。 我怎样才能实现它。是否有一些参数我可以设置,以便W(sp)始终可以接收队列中的所有事件

如果能提供帮助,那就太好了

编辑1

我发现理解这个问题有点棘手,这是另一个版本

我想循环分享队列中的作业,这样一份工作只给消费者一次,因为我想做并行处理工作,同时我想要一个特殊的消费者,这也将得到所有的队列中的工作。

例如:

counsumer - C1,C2,C3,C4

特殊消费者 - Csp

队列 - Q

Q中的每个作业都应该广播到C1,C2,C3,C4中的一个并与Csp共享。 因此,来自Q的作业在Csp和C(i)之一之间共享。有了这个,我将能够并行处理C1,C2,C3,C4等工作,同时用我的消费者Csp验证Q中的每个工作

2 个答案:

答案 0 :(得分:0)

据我了解,您需要Topic Exchange。为消息设置不同的路由键。让工人选择他们感兴趣的东西。例如,需要获取所有消息的工作人员可以创建一个队列并使用“#”(哈希)绑定密钥将其绑定到交换。

  
    

我们创建了三个绑定:Q1绑定了绑定键“ .orange。”,Q2绑定了“ .rabbit”和“lazy。#”。

  
     

这些绑定可以概括为:

Q1 is interested in all the orange animals.
Q2 wants to hear everything about rabbits, and everything about lazy animals.
     

路由键设置为“quick.orange.rabbit”的消息将是   送到两个队列。消息“lazy.orange.elephant”也将消失   对他们两个。另一方面,“quick.orange.fox”只会去   第一个队列,“lazy.brown.fox”只到第二个队列。   “lazy.pink.rabbit”只会被传送到第二个队列一次,   即使它匹配两个绑定。 “quick.brown.fox”不匹配   任何约束,所以它将被丢弃。

更新:

看看这个人拥有的存储库:https://github.com/simonmacmullen

我想你会对这个感兴趣:https://github.com/simonmacmullen/random-exchange

This exchange type is for load-balancing among consumers.

答案 1 :(得分:0)

感谢vor寻求帮助,但我猜这没有帮助, 但我确实解决了这个问题。 它只是为队列命名,所以连接到队列的所有消费者都将获得循环共享的工作。 下面是一个例子

counsumer - C1,C2,C3,C4

特殊消费者 - Csp

队列 - Q

我应该按如下方式创建连接

的Emit:

channel.exchange_declare(exchange='logs2',type='fanout')

对于从C(i)接收事件,我应该绑定我的队列以与队列名称交换

channel.queue_bind(exchange='logs2',queue='hello')

连接到此队列的任何数量的消费者将以循环方式一次接收一个作业

用于接收与Csp交换的事件

channel.queue_bind(exchange='logs2',queue='special')

此特殊队列将接收来自交换的所有事件,因为它连接到exchange log2