症状
任务发布成功,但 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 而不修复导入路径,问题会反复出现;任务名变更后不同步部署会造成新旧消息混杂。