我正在学习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个消息在队列中等待它应该等待。
思想?
答案 0 :(得分:0)
很抱歉回答我自己的问题,但我终于得到了我正在寻找的行为。我需要将QoS prefetch_count设置为1.显然,通过不设置prefetch_count,只要一个客户端连接,所有200多条消息都被传送到其“通道”并从队列中排出,所以没有其他人可以看到任何工作,除非原始工作断开连接(从而关闭通道并将消息放回队列。
添加:
chan.basic_qos(0,1,False)
对我的工人来说,他们现在一次只能抓一条消息。不完全是我期待发生的事情,但它现在正如预期的那样工作。