Celery / RabbitMQ unacked消息阻塞队列?

时间:2015-06-14 13:41:58

标签: python rabbitmq celery urllib2

我已经调用了一个任务,用urllib2远程获取一些信息几千次。这些任务是使用随机eta(一周内)安排的,因此它们都不会同时命中服务器。有时我会得到404,有时候不会。我正在处理错误,以防它发生。

在RabbitMQ控制台中,我可以看到16条未确认的消息:16 unacknowledged messages

我停止芹菜,清除队列并重新启动它。 16条未经确认的消息仍在那里。

我有其他任务进入同一个队列,但也没有执行任何任务。清除后,我尝试提交另一个任务,状态仍为 ready

enter image description here

我有什么想法可以找出为什么邮件仍未被确认?

版本:

celery==3.1.4
{rabbit,"RabbitMQ","3.5.3"}

celeryapp.py

CELERYBEAT_SCHEDULE = {
    'social_grabber': {
        'task': '<django app>.tasks.task_social_grabber',
        'schedule': crontab(hour=5, minute=0, day_of_week='sunday'),
    },
}

tasks.py

@app.task
def task_social_grabber():
    for user in users:
        eta = randint(0, 60 * 60 * 24 * 7) #week in seconds
        task_social_grabber_single.apply_async((user), countdown=eta)

此任务没有定义路由,因此它进入默认队列: celery 。有一个工作人员处理此队列。

supervisord.conf:

[program:celery]
autostart = true
autorestart = true
command = celery worker -A <django app>.celeryapp:app --concurrency=3 -l INFO -n celery

2 个答案:

答案 0 :(得分:3)

RabbitMQ破坏了版本3.3中的QoS设置。您需要将芹菜升级至至少3.1.11(changelog)并将kombu升级至至少3.0.15(changelog)。您应该使用最新版本。

当3.3发布时,我发现了同样的行为。 RabbitMQ翻转了prefetch_count标志的默认行为。在此之前,如果消费者在eta&#d;消息中达到CELERYD_PREFETCH_MULTIPLIER限制,则工作人员将提高此限制以获取更多消息。此更改破坏了此行为,因为新的默认行为拒绝此功能。

答案 1 :(得分:0)

我有类似的症状。到达MQ的消息(在图表中可见)但未被工作人员接收的消息。

这让我假设我的Django应用程序正确设置了Celery应用程序,但我遗漏了an import ensuring Celery would be configured during Django startup

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app  # noqa

这是一个愚蠢的错误,但是回到AsyncResult后发给经纪人的消息让我偏离了轨道,让我看错了地方。然后我注意到设置CELERY_ALWAYS_EAGER = True并没有做下蹲,事件然后任务都没有被执行。

PS:这可能不是@kev问题的答案,但是因为我在这里遇到了几次,在寻找我的问题的解决方案时,我在这里发布给类似情况的任何人。