Skip to main content
 首页 » 编程设计

python之强制工作人员在启用持久交付模式时立即获取失败的消息

2025年05月04日14dflying

我有一个 RabbitMQ Server使用 Python-Pika 设置我获取消息的位置.问题是如果我有 persistent delivery mode启用,工作人员无法处理消息。它不会释放消息,而是会一直保留消息直到 RabbitMQ 连接被重置。

有没有办法确保未能自动处理的消息在合理的时间范围内从可用的工作人员(包括同一工作人员)处再次拾取?

这是我当前的代码

if success: 
    ch.basic_ack(delivery_tag=method.delivery_tag) 
else: 
    syslog.syslog('Error (Callback) -- Failed to process payload: %s' % body) 

我的想法是我永远不想丢失一条消息,相反我希望它被重新发布,或者更确切地说,如果它失败了,它会被重新拾起。在工作人员成功处理消息之前,情况应该始终如此。当其中一名工作人员无法打开与 HTTP 服务器的连接时,通常会发生这种情况。

请您参考如下方法:

我终于明白为什么会这样了。我没有意识到,当您处理完一条消息时,仅仅确认是不够的,还必须拒绝您无法使用 channel.basic_reject 处理的任何消息。这看起来很明显,但这不是 AMQP 的默认行为.

基本上我们必须使用 basic_reject 将 requeue 设置为 True 来释放消息。这里的重要因素是 requeue 关键字,它可以防止消息被丢弃,而是将其重新排队,以便我们可用的工作人员之一可以处理它。

if success: 
    # On Success - Mark message as processed. 
    ch.basic_ack(delivery_tag=method.delivery_tag) 
else: 
    # Else - Mark message as rejected and move it back to the queue. 
    ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True) 

我在 this 中找到了一些非常有用的信息文章,并且在 this 中有关于 reject 关键字的更多技术细节。博文。