rabbitmq 为什么从队列消费时需要循环调用?

mwngjboj  于 2023-10-20  发布在  RabbitMQ
关注(0)|答案(1)|浏览(173)

我正在尝试使用鼠兔和扭曲从兔子队列中消费:
1.不断(新消息->消费)
1.一次(新消息->消费一次,不要再消费,直到我这么说)
我唯一的输入是example。它涵盖了用例1。那么用例2呢?
basic_consume不是以一种新消息就绪时会“通知”的方式实现的吗?为什么我的工作是启动循环调用?看起来轮询是反对twisted中的事件循环模式的,不是吗?

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

以下是我希望它如何工作:
1.订阅队列

  1. consume from queue(除非队列中有消息,否则不会立即触发,每当队列中有新消息时都会触发,我现在忽略 qos。)
    如何使用单个消息,例如:basic_get?我是否需要启动循环调用,并在收到消息后立即停止它?
4ktjp1zp

4ktjp1zp1#

你问了好几个问题,所以我会尽量回答。我是Pika的维护人员之一,但对Twisted并不像其他连接适配器那样熟悉。
basic_consume不是以一种当新消息就绪时会“通知”的方式实现的吗?为什么我的工作是启动循环调用?看起来轮询是反对twisted中的事件循环模式的,不是吗?
Twisted's documentation for LoopingCall表示:
反复调用一个函数。如果f返回一个deferred,则在deferred被触发之前不会进行重新调度。
example code使用@defer.inlineCallbacksyield语句返回延迟函数。因此,LoopingCall不会**重复调用该函数,它只会在deferreds触发后安排一个新的调用。
我希望它是这样工作的... consume from queue(不会立即触发,除非队列中有消息,每次队列中有新消息时都会触发,我现在忽略qos。)
这正是示例代码的工作方式。
如何使用单个消息,例如:basic_get?我是否需要启动循环调用,并在收到消息后立即停止它?
如果将预取(QoS)设置为1,则RabbitMQ将只向消费者发送一条消息,并且在第一条消息被basic_ack确认之前不会发送下一条消息。

相关问题