从Rabbitmq文档中阅读关于消费者的信息可以发现,消费者有两种可能的方式来处理消息:
在队列中存储消息是无用的,除非应用程序可以使用它们。在AMQP 0-9-1模型中,应用程序有两种方法可以做到这一点:
Have messages delivered to them ("push API")
Fetch messages as needed ("pull API")
对于“推送API”,应用程序必须表明对使用来自特定队列的消息的兴趣。当他们这样做时,我们说他们注册了一个消费者,或者简单地说,订阅了一个队列。
我只是想知道
1.celery 工人在哪工作?
1.有没有办法选择/改变方式?
在Celery文档中没有找到任何关于这一点的具体信息。
1条答案
按热度按时间vxf3dgd41#
1.不,据我所知,拉的方法从来没有真正适应celery 的设计。
RabbitMQ文档has been updated(在提出这个问题后)指出,推送方法是强烈推荐的选项,而拉取/轮询方法“效率非常低,在大多数情况下应该避免”。在一个相关的文档中,它说:
一个接一个地获取消息是非常不鼓励的,因为与常规的长寿消费者相比,它非常低效。与任何基于轮询的算法一样,在消息发布是零星的并且队列可以长时间保持空的系统中,这将是极其浪费的。
当任务/消息不是实时需要的时候,这种关于极度浪费的说法可能不成立,这样队列就可以在几个小时甚至更少的时间间隔内被轮询和排空,尽管像Celery/RabbitMQ这样的解决方案首先可能对这种用例来说有些过分。
我已经快速(有限地)浏览了Celery的源代码,我可以说,它的架构的很大一部分似乎只是简单地假设push方法就是所使用的方法。有一些复杂的组件,如心跳机制,使系统在长时间运行和不可避免的网络故障的情况下更加强大;在拉取/轮询模式中根本不需要这些组件。