Celery任务隔次失败提示未注册问题排查求助
Celery任务隔次触发
NotRegistered异常排查 我正在使用celery运行名为'filter'的任务,遇到了异常问题:每隔一次任务调用都会触发celery.exceptions.NotRegistered异常,表现为第1、3次调用正常,第2、4次调用失败。
任务调用代码
async_result1 = celery_app.send_task("filter", kwargs=data.dict()) output = {"task_id": async_result1.task_id}
轮询状态代码
result = AsyncResult(task_id) # 如果状态不是成功,持续轮询直到成功
进入worker容器执行celery result查询失败任务ID时,报错栈最后一行显示celery.exceptions.NotRegistered: 'filter'。
额外环境信息
- 使用
docker-compose启动worker,命令为:celery worker -A app.name -P threads --loglevel=DEBUG - 最初加
--queues参数时所有调用失败,移除后变为隔次失败 celery inspect active显示仅成功任务在队列中celery inspect registered显示仅ID结尾为1dda的worker注册了filter任务- 环境:
celery 4.4.0 (cliffs)、python 3.7.16
问题原因分析
核心原因是多个Celery Worker实例中仅一个注册了filter任务,任务通过随机分配机制分发:
- 当任务落到ID结尾为
1dda的Worker时,因该Worker已注册任务,执行正常; - 当任务落到其他未注册该任务的Worker时,就会触发
NotRegistered异常,进而出现隔次成功的现象。
最初添加--queues参数时全量失败,是因为指定的队列没有被注册filter任务的Worker监听,任务无法被正确消费。
解决方案
- 确保所有Worker正确注册任务
- 检查所有Docker容器内的Worker启动命令一致性,确认
-A app.name指向的模块中确实定义并注册了filter任务; - 重启所有Worker容器,保证每个实例都加载最新的任务定义。
- 检查所有Docker容器内的Worker启动命令一致性,确认
- 统一队列配置(可选)
- 若需指定队列,确保所有注册
filter任务的Worker都监听该队列,比如启动命令添加--queues filter_queue,同时调用任务时指定队列:celery_app.send_task("filter", kwargs=data.dict(), queue="filter_queue")。
- 若需指定队列,确保所有注册
- 验证Worker注册状态
- 执行
celery inspect registered命令,确认所有Worker都显示已注册filter任务后,再重新测试任务调用。
- 执行
无需单独刷新或重启队列,只要保证Worker实例都正确注册任务并监听对应队列即可。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

