You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:25