从我的制作人代码中我想知道消费者何时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)
这让我觉得它应该首先得到我想要的。
答案 0 :(得分:4)
confirm_deliveries
只是意味着当 RabbitMQ 收到消息时,将返回basic.ack(收到消息)或basic.nack(未收到消息)。
但这并不能保证邮件已成功传递到队列。您需要为不可路由的消息添加强制标志以引发异常。
您可以阅读有关确认递送和强制性标记here的更多信息。
回答你的问题;发布者无法知道消费者是否成功处理了该消息。但是,如果消费者未能消费消息,则应重新排队并由另一个消费者处理,但这取决于消费者的设计程度。
如果您确实需要知道消息是否已正确处理,那么实现类似于回复请求状态的RPC调用可能是最好的方法。如果在X秒内未收到响应,则假定未处理该消息。 https://www.rabbitmq.com/tutorials/tutorial-six-python.html
如果您需要rpc发布者的异步示例,可以查看我的一些示例:here。