2

我正在使用 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 是否更适合我正在做的事情?

我认为如果有更多的“写页面”工作人员会有所帮助,但我也想以某种方式强制“写页面”任务优先。

我将不胜感激。谢谢!

4

1 回答 1

1

如果内存已满并且发布者正在避免流控制,RabbitMQ 的性能可能会下降。RabbitMQ 管理插件将允许您更轻松地诊断问题。您将需要查找内存和/或磁盘的高水位标记,这将有助于您衡量容量。

于 2013-04-19T20:48:23.770 回答