Heaven 生产环境运维指南:Resque Worker 扩容、Redis 连接与故障排查清单 📅 发布时间:2026/8/23 12:42:14 👁 浏览次数: Heaven 生产环境运维指南Resque Worker 扩容、Redis 连接与故障排查清单【免费下载链接】heaven:walking: Rails app for GitHub Flow项目地址: https://gitcode.com/gh_mirrors/he/heavenHeaven 是一个基于 Rails 的 GitHub Flow 部署服务通过 Resque 任务队列异步执行部署并以 Redis 作为队列与锁的中枢。本指南面向生产环境运维人员覆盖Resque Worker 扩容、Redis 连接配置与常见故障排查清单帮助你快速定位部署延迟、任务积压等生产问题。️ 先看懂架构Web Worker 双进程模型Heaven 由两类进程组成对应 Procfile 中的两条启动命令web 进程unicorn应用服务器负责接收 Webhook 与 API 请求对应config/unicorn.rb默认 3 个 worker可通过WEB_CONCURRENCY调整worker 进程rake resque:work QUEUE*从 Redis 队列中取出任务并执行部署、状态回写等重活关键点请求进来 ≠ 部署开始。部署任务只是被放进 Redis 队列真正执行依赖 Worker。这也是生产故障最常见的误区——Web 正常但部署不动通常是 Worker 挂了或 Redis 不通。 Redis 连接配置4 种环境变量优先级分明Redis 连接逻辑集中在lib/heaven.rb按以下顺序自动选择优先级环境变量适用场景1REDIS_PROVIDER指向另一个环境变量的间接引用多容器部署推荐2REDISCLOUD_URLHeroku Redis Cloud 托管服务3OPENREDIS_URLOpenRedis 托管服务4BOXEN_REDIS_URLBoxen 集群 Redis—均未设置连接本机默认 Redis仅限开发/单机多容器部署技巧docker-compose.yml中的做法值得参考——先设置REDIS_PROVIDERREDIS_CONTAINER_URL再设置REDIS_CONTAINER_URLredis://heaven_redis。这种间接引用让同一份代码能灵活对接不同 Redis 地址。另外注意命名空间隔离所有 key 都带有heaven:#{Rails.env}前缀生产即heaven:productionResque 队列则进一步嵌套在heaven:production:resque下见config/initializers/resque.rb。这意味着同一 Redis 实例可安全承载多套 Heaven 环境排查队列长度、清理残留 key 时别忘加前缀否则会误删其他环境的数据⚡ Resque Worker 扩容按需增加并发最快扩容方式Worker 启动命令为bundle exec rake resque:work QUEUE*QUEUE*表示消费所有队列。生产扩容只需横向启动更多 Worker 进程PaaS 平台如 Heroku增加 worker 进程数量即可Docker / 裸机多起几个容器或 systemd 服务各自运行同一命令扩容前先看队列分工Heaven 的任务按队列分类见lib/heaven/jobs/下各 Job队列Job职责deploymentsDeployment执行实际部署带环境级锁statusesStatus回写 Commit 状态locksEnvironmentLock/EnvironmentUnlock环境加锁 / 解锁deployment_statusesLockedError等部署异常状态通知⚠️ 重要约束同一环境同时只允许一个部署。DeploymentJob 使用 Resque 分布式锁锁 key 为环境名-部署重复触发会走LockedError流程并提示 Already deploying.。因此增加 Worker 能提升跨环境/跨应用的并发能力同一环境内的部署串行是设计如此不是故障超时控制部署锁的超时时间由DEPLOYMENT_TIMEOUT环境变量控制默认 300 秒。长耗时部署如大型 Ansible Playbook建议显式调大避免锁提前释放导致并发部署冲突。 故障排查清单按现象对号入座现象最可能原因排查动作请求正常但部署无反应Worker 进程未运行 / 已崩溃检查 worker 进程存活查看其输出日志部署提示 Already deploying.前次部署超时未释放锁或 Redis 中残留锁 key确认DEPLOYMENT_TIMEOUT是否合理必要时清理heaven:production前缀下的锁 keyWorker 起不来 / 频繁重连Redis 不可达、URL 环境变量错误核对REDIS_PROVIDER指向的变量是否真实存在用redis-cli -u URL ping验证队列长度持续增长Worker 数量不足或某类任务卡死观察deployments队列积压区分是并发不足还是长任务阻塞环境锁定后无法部署忘记执行deploy:unlock用一次带deploy:unlock任务的部署解锁机制详见 doc/locking.mdWeb 偶发 502Unicorn worker 超时默认 15 秒检查config/unicorn.rb的 timeout 设置结合WEB_CONCURRENCY评估容量通用三板斧验证 Redis 连通ping成功即排除网络层检查队列积压关注heaven:production:resque前缀下的队列长度核对关键环境变量REDIS_PROVIDER、DEPLOYMENT_TIMEOUT、WEB_CONCURRENCY 本地用 Docker 验证配置修改 Redis 或队列配置后建议先用仓库自带的docker-compose.yml本地验证——它会拉起一个独立的redis容器并以REDIS_CONTAINER_URL方式注入给应用与生产的多容器模式完全一致是排查连接问题最安全的试验场。如需克隆代码自行验证git clone https://gitcode.com/gh_mirrors/he/heaven✅ 上线前检查清单Redis 地址通过环境变量正确注入且redis-cli ping通过Worker 进程数量与部署峰值匹配日志无 Redis 重连报错DEPLOYMENT_TIMEOUT已按最长部署耗时评估WEB_CONCURRENCY与容器 CPU 配额匹配已知晓heaven:productionkey 前缀约定运维操作不误伤其他环境掌握Resque Worker 横向扩容、Redis 环境变量优先级和锁机制原理这三块Heaven 生产环境 90% 的运维问题都能快速定位解决。【免费下载链接】heaven:walking: Rails app for GitHub Flow项目地址: https://gitcode.com/gh_mirrors/he/heaven创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考