首页 > 解决方案 > Pika - RabbitMQ - 为什么在为消费者使用预取计数 1 时我的交付率大于确认率

问题描述

我对 Python 中的 RabbitMQ 实现 PIKA 有疑问。我想从队列中使用 1 条消息,使用它并在工作完成时确认它。然后应该收到下一条消息。

我使用了 prefetch_count = 1 选项,告诉rabbitMQ这个消费者一次只想要1条消息并且在这条消息被确认之前不想要新消息。

这是我的(非常简单的)代码:

credentials = pika.PlainCredentials("username","password")
connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='1.2.3.4', credentials=credentials))
channel = connection.channel()

def consume(ch, method, properties, body):
    time.sleep(5) # Here is the work, now just hold 5 seconds
    ch.basic_ack(method.delivery_tag)

def init():
    channel.basic_consume(
        queue="raw.archive", on_message_callback=consume, auto_ack=False)
    channel.basic_qos(prefetch_count=1)
    channel.start_consuming()

if __name__ == "__main__":
    init()

所以我的问题是,为什么 rabbitmq 提供的文件(40/秒)比承认的(0.20/秒,正确,因为 5 秒暂停)更多。这两个不应该相等吗?此外,Unacked 值 (1650) 永远不应大于 1,因为它不应传递任何文档,直到该文档得到确认。

在此处输入图像描述

在此处输入图像描述 第二个视图显示,消费者没有预取计数。但是预取计数是在连接上设置的。也许我必须将它设置给消费者,但我不知道如何设置它。

我究竟做错了什么?

提前致谢。

标签: pythonrabbitmqpika

解决方案


正如马塞尔所证实的,

问题与在频道上设置 basic_qos 的时间有关。似乎它应该在 basic_consume 之前设置。

def init():
    channel.basic_qos(prefetch_count=1)
    channel.basic_consume(
        queue="raw.archive", on_message_callback=consume, auto_ack=False)
    channel.start_consuming()

推荐阅读