1

我正在尝试使用 pika 和扭曲从兔子队列中消费:

  1. 不断(新消息 -> 消费)
  2. 一次(新消息 -> 消费一次,在我说之前不要再次消费)

我唯一的输入是这个例子。它涵盖了用例 1。用例 2 呢?

不是basic_consume以在新消息准备好时“通知”的方式实现的吗?为什么开始循环呼叫是我的“工作”?轮询似乎与扭曲的事件循环模式相反,不是吗?

当使用 twisted 发出 http 请求时,它会发送请求并在返回后继续执行(通过延迟)。为什么这在 RabbitMQ/pika 中不起作用?

这是我期望它的工作方式:

  1. 订阅队列
  2. 从队列消费(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略qos。)

我如何使用一条消息,例如basic_get?我是否需要开始循环调用,一旦收到消息,就停止它?

4

1 回答 1

1

RabbitMQ 团队监控邮件列表rabbitmq-users有时只在 StackOverflow 上回答问题。


你问了几个问题,所以我会尽力回答所有问题。我是 Pika 的维护者之一,但不像其他连接适配器那样熟悉 Twisted。

basic_consume 不是以在新消息准备好时“通知”的方式实现的吗?为什么开始循环呼叫是我的“工作”?轮询似乎与扭曲的事件循环模式相反,不是吗?

Twisted 的文档LoopingCall说明了这一点:

重复调用一个函数。如果 f 返回一个 deferred,则在 deferred 被触发之前不会进行重新调度。

示例代码使用@defer.inlineCallbacks和语句yield返回延迟函数。因此,LoopingCall不会重复调用该函数,它只会在延迟触发后安排新的调用

这是我期望它的工作方式...从队列中消费(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略 qos .)

这正是示例代码的工作原理。

我如何使用一条消息,例如basic_get?我是否需要开始循环调用,一旦收到消息,就停止它?

如果您将预取 (QoS) 设置为1,那么 RabbitMQ 将只向消费者发送一条消息,并且在第一条消息被 确认之前不会发送下一条消息basic_ack

于 2018-04-11T13:59:50.223 回答