在我深入讨论我的问题之前,我想澄清的是,我已经做了大量的搜索,没有找到针对我的情况的具体答案.我有一个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环境的指导或建议都将不胜感激.