芹菜 - 工人没有完成新任务

时间:2016-05-16 13:50:31

标签: python django celery

我正在使用celeryhttrack异步镜像构建Web目录归档程序。我目前有一个由三台服务器组成的集群,每台服务器有五名工作人员。每项任务可能需要两到六个小时才能执行。 RabbitMQ用作代理,在rpc通道上有一些反向支持。

我为每个芹菜服务器配置了以下配置:

# Celery init script for ingestion workers
# Set _BIN, _CHDIR, _LOGFILE and _OPTS for the enviroment used.

# This specific configuration is for ingest PROD 2 only
# Define worker nodes to start
CELERYD_NODES="ingest_prod_2_1 ingest_prod_2_2 ingest_prod_2_3 ingest_prod_2_4 ingest_prod_2_5"

# Absolute path to celery executable
CELERY_BIN="/home/ubuntu/.virtualenvs/proj2.7/bin/celery"

CELERYD_CHDIR="/home/ubuntu/project/proj"

# App instance used
CELERY_APP="ingest.tasks"

#Log file location
CELERYD_LOG_FILE="/home/ubuntu/project/logs/django/%N.log"
CELERYD_LOG_LEVEL="DEBUG"
CELERYD_PID_FILE="/home/ubuntu/project/celery_%N.pid"

CELERYD_ACKS_LATE=True
CELERYD_PREFETCH_MULTIPLIER=1

# Celery options, define broker backtalk
CELERYD_OPTS="-b amqp://user:password@host/vhost -Q long_task_queue -c 1 -Ofair"

# Workers should run as an unprivileged user and create dirs if missing
CELERYD_USER="ubuntu"
CELERYD_GROUP="ubuntu"
CELERY_CREATE_DIRS=1

对于压力测试练习,我在任务队列中放入了200个任务。起初,所有工作人员都处于活动状态,但在完成初始任务后,两台服务器上的所有工作人员都没有完成任务。只有一台服务器继续运行,所有五名员工都在运行现在,两天后,一台服务器只有一个活动工作程序,其他所有服务器都处于空闲状态。结果,而不是在约150个任务执行的附近,我只看到40。

这是`celery -A ingest.tasks检查活动的结果':

-> ingest_prod_3_1@server_1: OK
    - empty -
-> ingest_prod_2_4@server_2: OK
    - empty -
-> ingest_prod_4_3@server_3: OK
    - empty -
-> ingest_prod_3_2@server_1: OK
    - empty -
-> ingest_prod_2_5@server_2: OK
    - empty -
-> ingest_prod_4_5@server_3: OK
    - empty -
-> ingest_prod_3_3@server_1: OK
    - empty -
-> ingest_prod_2_2@server_2: OK
    - empty -
-> ingest_prod_4_1@server_3: OK
    - empty -
-> ingest_prod_3_4@server_1: OK
    - empty -
-> ingest_prod_2_3@server_2: OK
    - empty -
-> ingest_prod_4_2@server_3: OK
    - empty -
-> ingest_prod_3_5@server_1: OK
    * {u'args': u"[u'url', 35637]", u'time_start': 464085.760026547, u'name': u'ingest.tasks.html.download', u'delivery_info': {u'priority': None, u'redelivered': False, u'routing_key': u'backlog.#', u'exchange': u'celery'}, u'hostname': u'ingest_prod_3_5@server_3', u'acknowledged': True, u'kwargs': u'{}', u'id': u'083b575c-8e52-4426-90a5-e9a6ceb117a4', u'worker_pid': 28807}
-> ingest_prod_2_1@server_2: OK
    - empty -
-> ingest_prod_4_4@server_3: OK
    - empty -

这是rabbitmq管理插件的队列选项卡

的屏幕截图

enter image description here

我设置的队列是backlogingest。所有其他人都是由rabbitmq建立的。我现在还不确定如何解释这些。

所以我不确定这里发生了什么。

1 个答案:

答案 0 :(得分:2)

在聊天中讨论之后,我真的认为你的问题是将RabbitMQ配置为CELERY_RESULT_BACKEND,这似乎从具有名称UIID的队列中可以看出,其中一些名称具有大量未消耗的消息。

这意味着任务将结果存储回代理,但没有人消耗导致RabbitMQ减速和冻结。 甚至在旧文档中也提到了这一点,它就是saing

  

较旧的AMQP后端(严重)模拟基于数据库的后端。

对CELERY_RESULT_BACKEND使用noSQL或缓存系统。

然而,在较新的版本中,此消息应自动过期,从而导致较少的问题,如docs中所写的兔子MQ。