← 中文资源

简体中文版本

Celery 报 Received unregistered task of type 错误

通过确保 worker 导入定义任务的模块并使用相同的 app 与任务名,修复 Celery 的未注册任务错误。

阅读英文原文

症状

任务发布成功,但 worker 记录 Received unregistered task of type 并将其丢弃。在本地 shell 直接调用同一函数却可运行,从而掩盖了问题,因为该进程已导入模块。该故障通常在部署代码变更或生产者与 worker 配置分离后出现。

诊断

用 celery -A app inspect registered 查看 worker 已知任务;启动 worker 观察导入的模块日志;核对生产端与 worker 的 broker、队列与任务名是否一致。

celery -A app inspect registered

根因

消息引用的任务名未被 worker 注册,因为其模块从未被导入,或生产端与 worker 在 app、队列或显式任务名上不一致。

修复

通过 include 或 autodiscover 让 worker 导入所有定义任务的模块,并保持生产者与 worker 的 app、broker、队列与任务名一致。重命名任务时两端一起发布,因为在途消息仍带旧名。

验证

发送一个测试任务确认 worker 能执行并记录结果,再运行 registered 检查确认任务名出现。既在列表中出现又能运行,即说明接线正确。

常见陷阱

只重启 worker 而不修复导入路径,问题会反复出现;任务名变更后不同步部署会造成新旧消息混杂。