员工无法完成Celery安排的任务,新员工也不会接任务

时间:2018-07-31 08:58:38

标签: python redis task celery distributed

此刻我的芹菜设置有问题。

我将redis用作具有以下celery设置的代理:

celery -A myProj worker -l debug -Q myProj --statedb=/file_storage/celery-state.state

CELERY_TIMEZONE = 'UTC'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACKS_LATE = True

app.conf.broker_transport_options = {'visibility_timeout': 87000}

kombu==4.2.0
celery==4.2.1

当前,我的软件在数据库中具有事件列表,这些事件具有应执行的特定日期和时间。

我有一个定期运行的celerybeat任务,它将检查数据库中是否有以下事件:a)今天要运行 &b)未完成&c)没有分配芹菜任务ID。如果任务找到满足这些条件的事件,它将使用task.apply_async(eta = ...)

将其分配给指定的时间。

问题在于,当前celery worker在服务器上的docker容器内运行,因此,如果服务器发生任何事情(例如更新或崩溃),则当系统恢复时,celery worker现在具有不同的主机名。例如从“ celery @ 84dfb9f7dbce”更改为“ celery @ b2ce45506957”,并且我认为与此同时,工作人员ID也已更改。

因此,实质上在重新启动发生之前计划的所有任务都会丢失,并且在系统恢复时,这些任务不会在其计划的时间执行。我认为是以下设置:

CELERY_LATE_ACKS = True

实际上意味着该任务仍未被确认,这意味着,如果在设置为执行任务时该任务尚未完成,则另一个工作人员将接替它。似乎不是这样,因为重新启动前我可以看到该任务是为具有特定主机名的特定工作程序安排的,而重新启动后是因为该工作程序已不存在,因此具有不同主机名的新工作程序不会执行该任务,即使理论上该任务设置为使用较晚的确认。

在这里我缺少什么来使计划的任务正确执行,而不管是否发生更新/崩溃/重新启动?

重启前我可以使用:

from celery.task.control import inspect
i = inspect()
i.scheduled()

要像这样安排任务:

{'celery@f5b65d4f7c80': [{'eta': '2018-07-30T13:00:19+00:00', 'priority': 6, 'request': {'id': '88e5a1ec-0e80-45df-83f6-a9e86e006ab8', 'name': 'my_task_name', 'args': '(142, 67, 83)', 'kwargs': '{}', 'type': 'my_task_name', 'hostname': 'celery@f5b65d4f7c80', 'time_start': None, 'acknowledged': False, 'delivery_info': {'exchange': '', 'routing_key': 'culturbook', 'priority': 0, 'redelivered': None}, 'worker_pid': None}}]}

我还可以查看redis并在“未确认的”中查看任务:

1) "8ff8b45f-a978-4383-8bd7-8a6c6e64cca1"
2) "[{\"body\": \"W1s4MDcsIDIxLCAxMl0sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"my_task_name\", \"id\": \"88e5a1ec-0e80-45df-83f6-a9e86e006ab8\", \"eta\": \"2018-07-30T13:00:19\", \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"20fdf4f0-4808-40da-9214-6c2d237fa0ba\", \"parent_id\": \"20fdf4f0-4808-40da-9214-6c2d237fa0ba\", \"argsrepr\": \"(142, 67, 83)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen13@f5b65d4f7c80\"}, \"properties\": {\"correlation_id\": \"88e5a1ec-0e80-45df-83f6-a9e86e006ab8\", \"reply_to\": \"717839ad-ee51-3980-a8d0-dbfc999bcaaa\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"myProj\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"8ff8b45f-a978-4383-8bd7-8a6c6e64cca1\"}}, \"\", \"myProj\"]"

它保持在未确认的重启后范围内,但是该任务未被其他工作人员承担。

0 个答案:

没有答案