Celery/RabbitMQ未确认的消息是否会阻塞队列?

7
我已经调用了一个任务,使用urllib2远程获取一些信息,这个任务已经被执行了几千次。任务的eta(在一周内)是随机安排的,所以它们不会同时访问服务器。有时我会得到404错误,有时则不会。如果出现错误,我会进行错误处理。
在RabbitMQ控制台中,我可以看到16条未确认的消息:16 unacknowledged messages 我停止了celery,清空了队列并重新启动了celery,但是这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

你能否发布你的Celery配置、Celery版本和RabbitMQ版本? - Eric Workman
完成。如果您需要任何其他帮助,请告诉我。 - kev
2个回答

4
兔子MQ在3.3版本中破坏了QoS设置。您需要将celery升级至至少3.1.11(changelog),并将kombu升级至至少3.0.15(changelog)。您应该使用最新版本。
当3.3发布时,我遇到了完全相同的情况。RabbitMQ翻转了prefetch_count标志的默认行为。在此之前,如果消费者达到了eta消息中的CELERYD_PREFETCH_MULTIPLIER限制,工作进程会增加此限制以获取更多消息。这次变化破坏了这种行为,因为新的默认行为否定了这种能力。

嗨@Eric,我遇到了同样的问题(16个作业在未确认状态下排队)。没有带有eta的任务,只有一个调度程序进程和3个工作进程,没有路由。我的队列每隔几个小时就会卡住,唯一解决方法是重新启动这两种进程类型。我在Heroku上,版本为kombu == 3.0.26和celery == 3.1.17。还有其他什么事情我可以查看以解决这个问题吗? - Flevour
@Flevour,你应该单独开一个问题,并附上kombu、celery和RabbitMQ的版本,以及工作进程的日志或输出和任务代码。 - Eric Workman
@Flevour,你找到解决问题的方法了吗? - Janusz Skonieczny

1
我有类似的症状。消息已经到达MQ(在图表中可见),但工作程序没有接收到。
这让我认为我的Django应用程序已经正确设置了Celery应用程序,但我缺少一个导入确保在Django启动期间配置Celery
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问题的答案,但由于我在寻找解决我的问题的过程中多次来到这里,所以我在这里发布它,以供处于类似情况的任何人使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接