AMQP / RabbitMQ多个消费者,但只有一个工作?

时间:2013-08-30 03:45:55

标签: python rabbitmq amqp

我正在学习AMQP,所以这可能是对我正在做的事情的误解。我正在尝试在我自己的私人服务器上设置rabbitmq以服务于一个系统的农场(我有一堆我需要处理的图像)。我建立了一个三步管道:

| put image on queue | --work_queue--> | process | --results--> | archive results | 

我安装了rabbitmq,并在服务器上创建了两个队列。 'work_queue'和'结果'。我使用amqplib编写了一些python脚本,我的管道工作正常,只有一个图像处理器工作者。我已经在队列中添加了100个图像,我的一台机器很乐意一次抓取一个并搅拌数据,并将结果放在结果队列中。

问题是,我假设如果我开始在另一台机器上运行另一个图像处理,它也会简单地将工作从队列中拉出来。这似乎是rabbitmq网站上“工作队列”教程中列出的确切案例。我希望这只是工作。然而,真正发生的是,无论我开始有多少其他工人,他们只是等待永远,永远不会得到任何工作,即使在work_queue中有大量的消息等待。

我误解了什么?在服务器上对工作进行排队的相关代码:

from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="foo:5672 ", userid="pipeline",
    password="XXXXX", virtual_host="/", insist=False)
chan = conn.channel()

....

msg = { 'filename': os.path.basename(i) }

chan.basic_publish(amqp.Message(json.dumps(msg)), exchange='',
        routing_key='work_queue')

过程工作者的消费者方面:

from amqplib import client_0_8 as amqp
conn = amqp.Connection(host="foo:5672 ", userid="pipeline",
    password="XXXXX", virtual_host="/", insist=False)
chan = conn.channel()

def work_callback(msg):
.... 

while True:
    chan.basic_consume(callback=work_callback, queue='work_queue')
    try:
        chan.wait()
    except KeyboardInterrupt:
        print "\nExiting cleanly"
        sys.exit(0)

我可以看到其他工人有联系:

$ sudo rabbitmqctl list_queues
Listing queues ...
results 0
work_queue      246
...done.

$ sudo rabbitmqctl list_connections 
Listing connections ...
pipeline        192.168.8.1     41553   running
pipeline        XX.YY.ZZ.WW     46676   running
pipeline        192.168.8.4     44482   running
pipeline        192.168.8.6     41884   running
...done.

其中XX.YY.ZZ.WW是外部IP。 192.168.8.6的工作人员在队列中搅拌,但外部IP上的工作人员在那里闲置,而246个消息在队列中等待它应该等待。

思想?

1 个答案:

答案 0 :(得分:0)

很抱歉回答我自己的问题,但我终于得到了我正在寻找的行为。我需要将QoS prefetch_count设置为1.显然,通过不设置prefetch_count,只要一个客户端连接,所有200多条消息都被传送到其“通道”并从队列中排出,所以没有其他人可以看到任何工作,除非原始工作断开连接(从而关闭通道并将消息放回队列。

添加:

chan.basic_qos(0,1,False)
对我的工人来说,他们现在一次只能抓一条消息。不完全是我期待发生的事情,但它现在正如预期的那样工作。