我正在使用 celery 和 rabbitmq 做一个看起来像这样的链:
fetch -> parse -> write pages
该write pages
部分发出它自己的一组异步任务来并行编写每个单独的页面(如我的另一个问题所述:在芹菜任务队列中,在一个组中运行任务与循环中的多个异步有什么不同吗?)
当我运行它很长时间时,我观察到它最终会停止。如果我重新启动芹菜,它会再次出现,但只有在执行另外 60 个左右的任务之后它才会再次停止。
我注意到当队列大小超过 400k 时会发生这种情况:
fast@build1 ~/dev/content-admin $ sudo rabbitmqctl list_queues
Listing queues ...
build1.prod2.ec2.cmg.net.celery.pidbox 0
celery 433410
...done.
我认为正在发生的事情是队列正在填充这些“写入页面”任务,这些任务会将更多项目添加到队列中,然后一旦它“满”,它就永远没有机会执行那些新添加的任务。
我通过临时修改“写页面”任务以立即返回(什么都不做)进行了实验,这似乎已经清除了拥塞并启用了所有约 400,000 页的输出。但是,我不是 100% 为什么这甚至有效。
RabbitMQ 或 Celery 是否有上限?它是否基于可用内存?或者它是可配置的?最后:我怎样才能更好地管理任务,以免发生这种情况?
redis 是否更适合我正在做的事情?
我认为如果有更多的“写页面”工作人员会有所帮助,但我也想以某种方式强制“写页面”任务优先。
我将不胜感激。谢谢!