Python 芹菜-工人不接受新任务

Python 芹菜-工人不接受新任务,python,django,celery,Python,Django,Celery,我正在使用和异步镜像构建一个web目录归档程序。我目前有一个由三台服务器组成的集群,每台服务器上有五个工人。执行每个任务可能需要两到六个小时。RabbitMQ用作代理,通过rpc通道进行一些反向对话 我对每个芹菜服务器都有以下配置: # Celery init script for ingestion workers # Set _BIN, _CHDIR, _LOGFILE and _OPTS for the enviroment used. # This specific configura

我正在使用和异步镜像构建一个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个任务。起初,所有工作人员都处于活动状态,但不久之后,两台服务器上的所有工作人员在完成初始任务后都没有拿起新任务。只有一台服务器继续运行,五名工作人员都在运行。现在,两天后,一台服务器只有一个活动工作进程,其他所有服务器都处于空闲状态。因此,我只看到40个任务,而不是大约执行150个任务

这是“芹菜-摄入。任务检查活动”的结果:

-> 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管理插件的队列选项卡的屏幕截图

我设置的队列是
backlog
inset
。所有其他都由rabbitmq设置。我不知道现在该如何解释这些


因此,我不确定这里发生了什么。

在聊天室中讨论后,我真的认为您的问题是将RabbitMQ配置为芹菜\u结果\u后端,从具有名称UIID的队列中可以清楚地看出,其中一些队列具有大量未使用的消息

这意味着任务正在将结果存储回代理中,但没有人在消费,从而导致RabbitMQ减慢并冻结。 这甚至在老文件中提到过

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

对芹菜\u结果\u后端使用noSQL或缓存系统


但是,在较新的版本中,此消息应自动过期,从而减少rabbit MQ的问题,如中所述。

关于rabbit队列如何?任务仍在代理中,或者消息已被使用?我想可能是预回迁的问题,所以我在配置中添加了
ACKS\u LATE=True
prefetch\u乘数=1
。似乎没有效果。可能不得不转用redis做经纪人……奇怪。我刚刚检查了活跃的工人,他们都在一台机器上。集群中的其他两台服务器都是空闲的。嗨,我认为问题不在于这里的代理。Rabbit MQ被设计为在这样或那样更复杂的场景中是可靠的。您能回答我关于队列大小的问题吗?我不确定您所说的队列大小是什么意思,但在问题中添加了rabbitmq管理的队列选项卡的屏幕截图。谢谢,答案已更改。