【问题标题】:Twisted and Pika - How to add callback to a message ack call?Twisted 和 Pika - 如何为消息确认调用添加回调?
【发布时间】:2014-11-15 23:30:04
【问题描述】:

我正在使用 pika 的 twisted protocol adapter。当我成功处理消息后,我使用此调用向 RabbitMQ 发送确认:

channel.basic_ack(delivery_tag=delivery_tag) 

basic_ack 调用似乎是异步触发的,但它没有返回延迟,因此我无法添加回调或 errback。我现在遇到了一个小问题,因为我想等待队列中的某个消息,处理它并关闭反应器,即

channel.basic_ack(delivery_tag=delivery_tag)
reactor.stop()

当然,反应堆在消息发送之前就关闭了。我正在通过延迟关机来解决这个问题

channel.basic_ack(delivery_tag=delivery_tag)
reactor.callLater(5, reactor.stop)

但这似乎是一种非常“hacky”的方式。我希望能够执行以下操作:

d = channel.basic_ack(...)
d.addBoth(lambda x: reactor.shutdown())

我在这里遗漏了一些明显的东西吗?真的不可能在 ack 调用结束时链接回调吗?

【问题讨论】:

  • 您希望回调发生在什么时候?
  • 当确认已经成功发送到 RabbitMQ 时,基本上是“谢谢我已经完成了你让我做的工作,现在我要关机了”
  • RabbitMQ 协议是否包含 ack for acks?如果没有,你怎么知道ack已经成功发送到RabbitMQ?
  • 不,它没有,但如果我使用阻塞调用,我会阻塞直到执行恢复或引发异常。 pika 的扭曲包装类似乎为某些调用返回延迟,但在 ack 调用的情况下,它只是异步执行它,但不返回任何东西。我可能误解了它的工作原理,因此我的问题
  • 我怀疑 pika 的 API 返回 Deferred 的情况是 RabbitMQ 服务器返回响应的情况。很容易看出为什么在这些情况下返回 Deferred 是有意义的——因为当请求/响应 API 是异步的时,Deferred 是获取包含在服务器响应中的数据的唯一方法。在这种情况下,也很容易看出 Deferred 何时触发 - 当从服务器接收到响应时它会触发。如果服务器没有发送响应,那么 Deferred 何时触发就不太明显了。与阻塞代码的比较只让我们到目前为止。

标签: twisted pika python-pika


【解决方案1】:

所以看来唯一的选择是等待并希望确认已成功发送

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2013-06-07
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2016-10-07
    相关资源
    最近更新 更多