在我深入讨论我的问题之前,我想澄清的是,我已经做了大量的搜索,没有找到针对我的情况的具体答案.我有一个Ruby on rails应用程序,我将其部署在Heroku和EC2实例上. 为了管理后台作业(job),我使用Sidekiq和Sidekiq Cron来调度任务.我的目标是只在EC2实例上而不是在Heroku上初始化Sidekiq Cron作业(job),对于Heroku,我在配置中使用了以下条件:

# Initialize Sidekiq Cron only if not running on Heroku
unless ENV['DYNO']
  schedule_file = 'config/schedule.yml'

  if File.exist?(schedule_file) && Sidekiq.server?
    Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
  end
end

该条件判断Dyno环境变量是否存在,该环境变量理论上应该只存在于Heroku上,以防止Sidekiq Cron在那里初始化.然而,我遇到了这样一种情况,尽管进行了判断,Sidekiq Cron作业(job)还是以某种方式在我的Heroku部署上初始化了,导致了意外的行为和生产中的重大问题.

我对此感到困惑,因为据我所知,Dyno环境变量应该是Heroku环境的可靠指示器.我已经确认了CONFIG/Schedule.yml存在并且格式正确.在这个问题之外,Sidekiq也在发挥预期的作用.

有没有人遇到过类似的问题,或者可以深入了解Dyno环境变量判断在这种情况下可能失败的原因?在Heroku中管理或公开环境变量的方式会不会有什么不同,这是我没有注意到的?任何关于如何有效地将Sidekiq Cron初始化仅隔离到EC2环境的指导或建议都将不胜感激.

推荐答案

经过一次彻底的调查和一个不眠之夜,我发现问题不在于Dyno环境变量判断,而在于Sidekiq Cron的行为.Sidekiq Cron似乎会自动加载cron配置文件,该文件名为CONFIG/Schedule.yml.这意味着,尽管我进行了条件判断,但仍在Heroku上初始化cron作业(job),因为该文件存在并且遵循命名约定.

可以通过多种方式从YAML文件加载作业(job)

GEM将自动加载中提到的作业(job) 配置/调度.yml文件(支持ERB)

sidekiq-cron

为了解决这个问题,我将cron配置文件从config/schedule.yml重命名为config/ec2_schedule.yml.然后,我更改了我的条件,只在Dyno环境变量不存在的情况下加载该文件,以确保cron作业(job)只在EC2实例上初始化,而不在Heroku上初始化.

# Initialize Sidekiq Cron only if not running on Heroku
unless ENV['DYNO']
  schedule_file = 'config/ec2_schedule.yml'

  if File.exist?(schedule_file) && Sidekiq.server?
    Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
  end
end

Ruby-on-rails相关问答推荐

RSpec系统测试无法从工厂访问新创建的记录

ActiveAdmin:的呈现索引表在父级的显示页中有许多资源

Ruby on Rails 身份验证:设计注册不起作用

是否可以使用 Turbo 帧更新 Rails 表单输入字段值?

如何在 Rails 中声明动态路由范围/命名空间变量?

Rails - Comment.count没有改变1

Rails 3 的data-method='delete'如何优雅地降级?

Rails:保存子对象时更新父对象

FactoryGirl + Faker - 为数据库种子数据中的每个对象生成相同的数据

水豚 click_link 与 :href 匹配

在 Ruby on Rails 上,我们如何在控制器中打印调试信息?

指定要从 before_filter 中排除的控制器

在公共 Rails 应用程序中将敏感数据存储在哪里?

在 Rails 中将表格行变成链接

如何在 Windows 上为 Ruby 安装 sqlite3?

如果缺少翻译,则回退到默认语言

Rails:从视图内渲染视图(不是部分视图)

设计:在注册期间禁用密码确认

Rails,Docker:主机不存在:默认

我的 JavaScript 模式/实践很糟糕.我应该go 哪里寻求帮助?