解决Heroku上Celery超时问题:长时异步任务504错误排查
解决Heroku上Celery异步任务30秒超时问题
针对你在Heroku部署Django+Celery时遇到的30秒超时问题,结合本地正常运行、Heroku指向Celery配置的情况,给出以下针对性解决方案:
1. 完善Broker传输层超时配置
如果使用Heroku Redis作为Celery Broker,默认Socket超时可能为30秒,会导致任务执行中Broker连接中断。在Django settings中补充Socket相关超时配置:
CELERY_BROKER_TRANSPORT_OPTIONS = { "visibility_timeout": 60 * 60 * 2, # 保留原有2小时可见性超时 "socket_timeout": 600, # 设置Socket读写超时为10分钟 "socket_connect_timeout": 600, # 设置Socket连接超时为10分钟 "socket_keepalive": True, # 启用长连接避免断连 }
2. 调整Celery Worker并发数
Heroku Dyno资源有限,过高的并发数会导致单个任务无法获得足够资源触发超时。修改Procfile中的worker命令,根据Dyno规格设置合理并发(免费/基础Dyno建议设为1):
web: gunicorn mngrs_backend.wsgi --timeout 600 worker: celery -A mngrs_backend worker -l info --time-limit=7200 --concurrency=1
3. 验证Celery配置是否生效
配置可能未被Worker正确加载,可通过Heroku CLI执行命令查看当前Worker的实际配置:
heroku run celery -A mngrs_backend inspect conf
检查输出中的task_time_limit、task_soft_time_limit是否与你设置的60*12、60*10一致,若不一致需排查配置文件加载顺序(比如确保celery.py正确读取Django settings)。
4. 强制重启Heroku Dyno
修改配置后必须重启Worker和Web Dyno才能生效:
heroku restart worker heroku restart web
额外排查点
- 确认OpenAI API请求未被Heroku网络拦截:在任务中添加日志,打印API请求的耗时和状态,确认是否是API请求在Heroku环境下被卡30秒。
- 查看Celery Worker实时日志:通过
heroku logs --tail --ps worker定位超时发生的具体阶段(是Broker通信阶段还是API请求阶段)。
内容的提问来源于stack exchange,提问作者Hippolyte BRINGER
相关产品推荐
相关产品推荐

