当经纪人收到消息或消费者承认时,pika confirm_delivery是否确认?

时间:2017-03-15 14:57:39

标签: rabbitmq amqp 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')

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

这可能是重复的 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)

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

1 个答案:

答案 0 :(得分:4)

confirm_deliveries只是意味着当 RabbitMQ 收到消息时,将返回basic.ack(收到消息)或basic.nack(未收到消息)。

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

您可以阅读有关确认递送和强制性标记here的更多信息。

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

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

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