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

时间:2013-04-15 11:03:21

标签: python python-2.7 rabbitmq pika python-pika

我设置了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服务器的连接时,通常会发生这种情况。

1 个答案:

答案 0 :(得分:1)

我终于弄清楚为什么会这样。我没有意识到仅仅在您完成消息时确认是不够的,而且还必须拒绝使用channel.basic_reject无法处理的任何消息。这似乎很明显,但它不是AMQP的默认行为。

基本上,我们必须使用basic_rejectrequeue设置为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关键字有更多技术细节。