【发布时间】:2014-07-01 09:21:54
【问题描述】:
我有两种任务。任务 A 由 celerybeat 每小时生成一次。它立即运行,并生成一千个(或数千个)任务 B 实例,每个实例的 ETA 为未来一天。
在启动时,任务 A 的一个实例运行并生成一千个 B。从那时起,什么都没有发生。我应该看到另一个 A 每小时运行,另外一千个 B。但实际上我什么也没看到。
在冻结时,rabbitmqctl 显示 1000 条消息,其中 968 条准备就绪,32 条未确认。一小时后,有 1001 条消息,969 条准备就绪,32 条未确认。以此类推,每小时都会有一条新消息归类为就绪。大概发生的事情是工作人员正在预取 32 条消息,但无法对它们采取行动,因为他们的 ETA 仍在未来。同时,本应立即运行的较新任务无法运行。
处理这个问题的正确方法是什么?我猜我需要多个工人,也许还有多个队列(但我不确定后一点)。有没有更简单的方法?我试过摆弄 CELERYD_PREFETCH_MULTIPLIER 和 -Ofail (如此处所述:http://celery.readthedocs.org/en/latest/userguide/optimizing.html),但无法完成。我的问题和这个问题一样吗:[[Django Celery]] Celery blocked doing IO tasks?
无论如何:我能解决这个问题只是因为我对任务的性质和时间安排了如指掌。未来 ETA 的足够多的任务可以锁定整个系统,这似乎不是一个设计缺陷吗?如果我等待几个小时,然后杀死并重新启动工作程序,它会再次抓取前 32 个任务并冻结,即使此时队列中有准备好运行的任务。某些组件不应该足够聪明以查看 ETA 并忽略不可运行的任务吗?
附录:我现在认为这个问题是当 RabbitMQ 3.3 与 Celery 3.1.0 一起使用时的一个已知错误。更多信息在这里: https://groups.google.com/forum/#!searchin/celery-users/countdown|sort:date/celery-users/FiAAESOzezA/499OH-pylacJ
更新到 Celery 3.1.1 后,情况似乎好多了。任务 A 每小时运行一次(嗯,它有几个小时)并安排任务 B 的副本。这些似乎正在填满工作人员:未确认消息的数量继续增长。我得看看它是否可以无限制地生长。
【问题讨论】:
-
是的,RabbitMQ 3.3 打破了一切。我也遇到了同样的问题,Ask 很快发布了 Celery 3.1.11、Kombu 3.0.13 和 librabbitmq 1.5.0。
-
谢谢你,我花了一整天的时间试图找出问题所在,直到我发现这个!
-
你现在解决了吗?
标签: python rabbitmq celery scheduling