首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >皮卡- RabbitMQ -为什么我的交付率大于确认率时使用预取-计数1为消费者。

皮卡- RabbitMQ -为什么我的交付率大于确认率时使用预取-计数1为消费者。
EN

Stack Overflow用户
提问于 2019-12-13 13:03:00
回答 1查看 481关注 0票数 2

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

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

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

代码语言:javascript
复制
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,因为它不应该传递任何文档,直到这个文档被认可为止。

第二个视图显示,使用者没有预取计数。但是在连接上设置了预取计数。也许我必须把它设置为消费者,但我不知道,如何设置这个。

我做错了什么?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 13:21:41

正如马塞尔所证实的

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

代码语言:javascript
复制
def init():
    channel.basic_qos(prefetch_count=1)
    channel.basic_consume(
        queue="raw.archive", on_message_callback=consume, auto_ack=False)
    channel.start_consuming()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59323174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档