鼠兔+;RabbitMQ:将基本_qos设置为prefetch=1仍然会使用队列中的所有消息

鼠兔+;RabbitMQ:将基本_qos设置为prefetch=1仍然会使用队列中的所有消息,rabbitmq,pika,qos,Rabbitmq,Pika,Qos,我有一个python worker客户机,它旋转10个worker,每个worker都连接到一个RabbitMQ队列。有点像这样: #!/usr/bin/python worker_count=10 def mqworker(queue, configurer): connection = pika.BlockingConnection(pika.ConnectionParameters(host='mqhost')) channel = connection.channel(

我有一个python worker客户机,它旋转10个worker,每个worker都连接到一个RabbitMQ队列。有点像这样:

#!/usr/bin/python
worker_count=10

def mqworker(queue, configurer):
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='mqhost'))
    channel = connection.channel()
    channel.queue_declare(queue=qname, durable=True)
    channel.basic_consume(callback,queue=qname,no_ack=False)
    channel.basic_qos(prefetch_count=1)
    channel.start_consuming()


def callback(ch, method, properties, body):
    doSomeWork();
    ch.basic_ack(delivery_tag = method.delivery_tag)

if __name__ == '__main__':
    for i in range(worker_count):
        worker = multiprocessing.Process(target=mqworker)
        worker.start()
我遇到的问题是,尽管在通道上设置了基本的qos,但第一个启动的工作进程接受队列中的所有消息,而其他工作进程则处于空闲状态。我可以在rabbitmq接口中看到这一点,即即使我将
worker\u count
设置为1并在队列上转储50条消息,所有50条消息都会进入“unacknowledged”存储桶,而我希望1条消息会变为unacknowledged,其余49条消息会准备就绪


为什么这不起作用?

我似乎已经通过移动调用
basic\u qos
的位置解决了这个问题


将其放在
channel=connection.channel()之后,似乎会改变我所期望的行为。

谢谢!这确实解决了问题。顺便说一句,这很难调试。@Hiagara是的,今天我自己遇到了这个问题。令人惊讶的是,近5年后,API中仍然没有明确或记录这一点。我认为我们应该在
基本消费之前声明
基本qos
。因为基本消费在初始化时使用此设置。与@rborodinov一致。我在
basic\u-consume
之后就有了
basic\u-qos
,但它不起作用。切换了它们,现在可以正常工作了。在设置
basic\u-consume
时,我还必须设置
auto\u-ack=False
,才能让它工作。否则,它仍然会消耗比预期更多的消息。