【问题标题】:Does pika confirm_delivery mean confirm when broker got the message or when consumer acknowledged?pika confirm_delivery 是否意味着在代理收到消息或消费者确认时确认?
【发布时间】:2017-08-06 09:41:58
【问题描述】:

从我的生产者代码中,我想知道消费者何时收到basic.acked 消息。

使用 channel.confirm_delivery()BlockingConnection 从文档中不清楚这是否应确认 1) 代理已收到消息,或 2) 消费者已确认收到消息。

运行此代码(没有消费者):

import pika
import uuid

# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection()
# Open the channel
channel = connection.channel()
queue = str(uuid.uuid4())

# Declare the queue
channel.queue_declare(queue=queue)

# Turn on delivery confirmations
channel.confirm_delivery()

# Send a message
if channel.basic_publish(exchange='',
                         routing_key=queue,
                         body='Hello World!',
                         properties=pika.BasicProperties(
                             content_type='text/plain',
                             delivery_mode=1)):
    print('Message publish was confirmed')
else:
    print('Message could not be confirmed')

显示要确认的消息。这不是我所期望或想要的。

这可能与 Behavior of channels in "confirm" mode with RabbitMQ 但是basic_publish 的文档说

:返回:如果未启用交货确认,则返回 True(pika 中的新 0.10.0);否则返回 False 如果消息不能 已交付(Basic.nack 和/或 Basic.Return)如果消息为 True 已交付(Basic.ack 且没有 Basic.Return)

这让我觉得它应该首先拥有我想要的。

【问题讨论】:

    标签: rabbitmq amqp pika


    【解决方案1】:

    confirm_deliveries 只是表示当RabbitMQ 收到消息时,要么返回basic.ack(收到消息)要么返回basic.nack(未收到消息)。

    但这并不能保证消息已成功传递到队列。您需要为不可路由的消息添加强制标志以引发异常。

    您可以阅读有关确认交货和强制标志here 的更多信息。

    回答您的问题;发布者无法知道消费者是否成功处理了消息。然而,如果一个消费者没有消费一条消息,它应该被重新排队并由另一个消费者处理,但这取决于消费者的设计有多好。

    如果您确实需要知道消息是否已被正确处理,那么实现类似 RPC 调用以回复请求状态可能是最好的方法。如果您在 X 秒内没有得到响应,则假定该消息未得到处理。 https://www.rabbitmq.com/tutorials/tutorial-six-python.html

    如果您需要 rpc 发布者的异步示例,可以查看我的一些烧瓶示例here

    【讨论】:

    • 非常感谢您解决这个问题 - 确实这是我经过一些测试后发现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2011-04-17
    • 2016-03-14
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多