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

Google Cloud Run中Rails+Sidekiq后台任务无法运行问题

解决Cloud Run上Rails + Sidekiq的Redis连接问题

让我们一步步拆解并解决你的问题:

核心问题诊断

从你的日志和配置来看,有两个关键问题导致了报错:

  1. Redis服务不可达:你配置的_REDIS_URL: redis://redis:6379/指向容器内部的redis服务名,但你的Cloud Run部署中并没有运行Redis容器——生产环境也不应该在同一容器内混用应用和Redis服务。这直接导致Web进程在推送Sidekiq任务到Redis时,触发Redis::CannotConnectError。
  2. Sidekiq并未实际启动:你的entrypoint.sh中,bundle exec rails server是阻塞式命令,它会一直占用进程运行Web服务,后面的bundle exec sidekiq永远不会被执行。哪怕Redis配置正确,Sidekiq也无法处理任务队列。

解决方案

我们先解决Redis的服务配置问题,再修复Sidekiq的启动逻辑:

一、配置生产级Redis服务(推荐Google Cloud Memorystore)

Google Cloud Memorystore是托管式Redis服务,完全适配Cloud Run,无需自行维护Redis实例:

  1. 创建Memorystore Redis实例:
    • 打开Google Cloud控制台,搜索「Memorystore」,创建一个Redis实例。选择和你的Cloud Run服务相同的区域(比如us-central1),保持默认的私有网络配置。
    • 创建完成后,复制实例的IP地址(示例:10.0.0.5)。
  2. 让Cloud Run能访问Memorystore:
    Memorystore不允许公网访问,需要配置VPC访问连接器:
    • 在Cloud控制台搜索「VPC访问连接器」,创建一个连接器,关联到Memorystore所在的VPC网络。
    • 更新你的Cloud Run服务配置,启用「VPC访问」并选择刚才创建的连接器。
  3. 更新Redis URL配置:
    修改cloudbuild.yaml的substitutions部分,把_REDIS_URL替换为Memorystore的连接地址:
    substitutions:
      # ... 其他配置保持不变
      _REDIS_URL: redis://10.0.0.5:6379/  # 替换成你的Memorystore实际IP
    

二、修复Sidekiq的启动方式

Cloud Run每个实例只能运行一个主进程,不能在同一个entrypoint里同时启动Web服务和Sidekiq,推荐两种方案:

方案1:将Sidekiq部署为独立的Cloud Run服务(生产环境首选)

这是最稳定的生产级方案:

  • 复制现有Cloud Run服务的配置,创建一个专门用于运行Sidekiq的服务。
  • 修改该服务的entrypoint.sh,只启动Sidekiq:
    #!/usr/bin/env bash
    cd /usr/src/app
    # 确保数据库已初始化
    bundle exec rake db:prepare
    # 清理残留的Sidekiq进程ID文件
    rm -f tmp/pids/sidekiq.pid
    # 启动Sidekiq
    bundle exec sidekiq -C config/sidekiq.yml
    
  • 确保这个Sidekiq服务拥有和Web服务完全相同的环境变量(包括Redis、数据库、密钥相关配置)。

方案2:用进程管理器在同一容器运行多进程(仅用于测试)

如果是测试场景,可以用Foreman来管理Web和Sidekiq进程:

  1. 在Gemfile中添加Foreman依赖:
    gem 'foreman'
    
  2. 在项目根目录创建Procfile文件:
    web: bundle exec rails server -b 0.0.0.0 -p $PORT
    sidekiq: bundle exec sidekiq -C config/sidekiq.yml
    
  3. 修改entrypoint.sh,替换原来的启动命令:
    # ... 保留db:prepare和日志清理步骤
    # 用Foreman启动两个进程
    bundle exec foreman start
    

⚠️ 注意:Cloud Run的资源限制可能会导致多进程不稳定,生产环境不推荐这种方式。


验证修复

  1. 重新部署Web服务(如果用方案1,同时部署Sidekiq服务)。
  2. 触发一个Sidekiq任务,查看Cloud Run日志,确认Redis连接错误消失。
  3. 检查Memorystore的监控面板,确认有连接请求和队列活动。

内容的提问来源于stack exchange,提问作者Adrià Carro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:02:52