芹菜任务永久启动(未重试)
Posted
技术标签:
【中文标题】芹菜任务永久启动(未重试)【英文标题】:Celery task STARTED permanantly (not retried) 【发布时间】:2020-04-25 03:06:06 【问题描述】:我们在 docker 实例中使用 celery worker。如果 docker 实例被终止(docker 可以更改并重新启动),我们需要重试该任务。我的任务目前看起来像这样:
@app.task(bind=True, max_retries=3, default_retry_delay=5, task_acks_late=True)
def build(self, config, import_data):
build_chain = chain(
build_dataset_docstore.s(config, import_data),
build_index.s(),
assemble_bundle.s()
).on_error(handle_chain_error.s())
return build_chain
@app.task(bind=True, max_retries=3, default_retry_delay=5, task_acks_late=True)
def build_dataset_docstore(self, config, import_data):
# do lots of stuff
@app.task(bind=True, max_retries=3, default_retry_delay=5, task_acks_late=True)
def build_index(self, config, import_data):
# do lots of stuff
@app.task(bind=True, max_retries=3, default_retry_delay=5, task_acks_late=True)
def assemble_bundle(self, config, import_data):
# do lots of stuff
为了模仿容器被重新启动(工人被杀死),我正在运行以下脚本:
SLEEP_FOR=1
echo "-> Killing worker"
docker-compose-f docker/docker-compose-dev.yml kill worker
echo "-> Waiting $SLEEP_FOR seconds"
sleep $SLEEP_FOR
echo "-> Bringing worker back to life"
docker-compose-f docker/docker-compose-dev.yml start worker
看着花,我看到任务已经开始了......很酷,但是......
为什么不重试? 我需要手动处理这种情况吗? 如果是这样,正确的做法是什么?编辑: 来自文档:
如果工作人员在经过考虑的时间后不会关闭,因为陷入无限循环或类似情况,您可以使用 KILL 信号强制终止工作人员:但要注意当前正在执行的任务将丢失(即,除非任务设置了 acks_late 选项)。
我正在使用 acks late 选项,为什么不重试?
【问题讨论】:
【参考方案1】:这里的问题似乎是 task_acks_late
(https://docs.celeryproject.org/en/latest/userguide/configuration.html#task-acks-late),我认为这是 celery 应用程序的参数。
我将task_acks_late
更新为acks_late
并添加了reject_on_worker_lost
,此功能按预期运行。
因此:
@app.task(bind=True, max_retries=3, default_retry_delay=5, acks_late=True, reject_on_worker_lost=True)
def assemble_bundle(self, config, import_data):
# do lots of stuff
【讨论】:
以上是关于芹菜任务永久启动(未重试)的主要内容,如果未能解决你的问题,请参考以下文章