使用Rabbitmq作为代理,celery workers工作在推API还是拉API上?

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

从Rabbitmq文档中阅读关于消费者的信息可以发现,消费者有两种可能的方式来处理消息:
在队列中存储消息是无用的,除非应用程序可以使用它们。在AMQP 0-9-1模型中,应用程序有两种方法可以做到这一点:

Have messages delivered to them ("push API")
Fetch messages as needed ("pull API")

对于“推送API”,应用程序必须表明对使用来自特定队列的消息的兴趣。当他们这样做时,我们说他们注册了一个消费者,或者简单地说,订阅了一个队列。
我只是想知道
1.celery 工人在哪工作?
1.有没有办法选择/改变方式?
在Celery文档中没有找到任何关于这一点的具体信息。

vxf3dgd4

vxf3dgd41#

  1. Celery使用push方法,因为它将消费者注册到队列,并且它维护与代理的长期连接。
    1.不,据我所知,拉的方法从来没有真正适应celery 的设计。
    RabbitMQ文档has been updated(在提出这个问题后)指出,推送方法是强烈推荐的选项,而拉取/轮询方法“效率非常低,在大多数情况下应该避免”。在一个相关的文档中,它说:
    一个接一个地获取消息是非常不鼓励的,因为与常规的长寿消费者相比,它非常低效。与任何基于轮询的算法一样,在消息发布是零星的并且队列可以长时间保持空的系统中,这将是极其浪费的。
    当任务/消息不是实时需要的时候,这种关于极度浪费的说法可能不成立,这样队列就可以在几个小时甚至更少的时间间隔内被轮询和排空,尽管像Celery/RabbitMQ这样的解决方案首先可能对这种用例来说有些过分。
    我已经快速(有限地)浏览了Celery的源代码,我可以说,它的架构的很大一部分似乎只是简单地假设push方法就是所使用的方法。有一些复杂的组件,如心跳机制,使系统在长时间运行和不可避免的网络故障的情况下更加强大;在拉取/轮询模式中根本不需要这些组件。

相关问题