pika confirm_delivery是否意味着在经纪人收到消息时或在消费者确认时确认?

Mar*_*tin 5 amqp rabbitmq pika

从我的生产者代码中,我想知道消费者何时basic.ack发出消息。

使用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')
Run Code Online (Sandbox Code Playgroud)

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

这可能与RabbitMQ在“确认”模式下的通道行为重复, 但是basic_publish的文档说

:returns:如果未启用交货确认,则为true(在pika 0.10.0中为NEW);否则,如果无法传递消息(Basic.nack和/或Basic.Return),则返回False;如果传递了消息,则返回True(Basic.ack而没有Basic.Return)

这让我认为它应该首先具有我想要的。

ean*_*son 5

confirm_deliveries仅表示当RabbitMQ收到消息时,将返回basic.ack(收到消息)或basic.nack(未收到消息)。

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

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

回答您的问题;发布者无法知道使用者是否成功处理了该消息。但是,如果使用者无法使用消息,则应重新排队并由另一个使用者处理该消息,但这取决于使用者的设计水平。

如果您真的需要知道消息是否已正确处理,则实现RPC调用之类的方式来回复请求状态可能是最好的方法。如果您在X秒钟内未收到回复,则假定未处理该消息。 https://www.rabbitmq.com/tutorials/tutorial-six-python.html

如果您需要RPC发布者的异步示例,可以在这里查看我的flask示例。