gpt4 book ai didi

rabbitmq - pika verify_delivery 是否意味着代理收到消息或消费者确认时确认?

转载 作者:行者123 更新时间:2023-12-02 20:07:32 25 4
gpt4 key购买 nike

从我的生产者代码中,我想知道消费者何时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 的文档说

:returns: True if delivery confirmation is not enabled (NEW in pika 0.10.0); otherwise returns False if the message could not be deliveved (Basic.nack and/or Basic.Return) and True if the message was delivered (Basic.ack and no Basic.Return)

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

最佳答案

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

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

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

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

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

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

关于rabbitmq - pika verify_delivery 是否意味着代理收到消息或消费者确认时确认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com