我设置了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)
我的想法是,我绝不想丢失消息,而是希望它重新发布,或者如果失败则再次获取。在工作人员成功处理消息之前,应始终如此。当其中一个worker无法打开与HTTP服务器的连接时,通常会发生这种情况。
答案 0 :(得分:1)
我终于弄清楚为什么会这样。我没有意识到仅仅在您完成消息时确认是不够的,而且还必须拒绝使用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)