【问题标题】:scheduling a job every minute Rails 3.1 on Heroku在 Heroku 上的 Rails 3.1 每分钟安排一个作业
【发布时间】:2011-11-11 01:46:38
【问题描述】:

我想在 Heroku 上每分钟运行一个任务,以检查是否满足条件以使某些用户任务超时。我只能每小时运行一次 Heroku cron 作业,那么设置这样的定时任务的最佳方法是什么。我在 Heroku 上使用 Rails 3.1。

【问题讨论】:

    标签: ruby-on-rails heroku cron scheduling ruby-on-rails-3.1


    【解决方案1】:

    从今天开始,您可以使用日程安排 gem,clockwork。 Heroku 官方支持这一点,你可以找到他们的文档here

    【讨论】:

    • 请注意,clockwork 需要测功机,因此它的成本与任何其他类型的测功机相同(每小时 0.05 美元,按秒计费 - 大约 35 美元/月)。 要求“每分钟”安排一次,但每10分钟每小时每天都可以(在特定时间),然后考虑Heroku Scheduler,一个免费插件。
    • clockwork 的另一个限制是它只能在单个测功机上运行,​​因此如果您的计划工作比单个进程可以处理的多,delayed_job 解决方案会更好。
    【解决方案2】:

    您可以将delayed_job 与带有:run_at 的自重启作业一起使用。有点像这样:

    class YourJob
        def do_interesting_things
            #... Do what needs to be done.
            self.delay(:run_at => 1.minute.from_now).do_interesting_things
        end
    
        def self.start_me_up
            new.do_interesting_things
        end
    end
    

    然后在您的应用程序初始化期间的某个地方:

    YourJob.start_me_up
    

    【讨论】:

    • 谢谢 - 我今天会试试,如果可行,我会接受答案 :-)
    • 这成功了吗?我需要每 1 分钟运行一次 rake 任务,并且我认为应该有一种方法可以让它自行运行而不是需要 cron。目前,heroku 上的 cron 最多每小时一次。
    • @ylluminate:我从来没有收到过回复,但它应该可以工作,试试吧,让我知道它是怎么回事。
    • @mhz:该方法并不是真正的递归。 delay 调用将一个条目添加到 DelayedJob 队列,DJ 将在扫描队列时调用 do_interesting_things。所以do_interesting_things 并不是真的在呼唤自己,而是让 DJ 稍后呼唤自己。
    【解决方案3】:

    发条是要走的路,但我会建议另一种解决方法。

    使用调度程序(每 10 分钟)+ 延迟作业每分钟执行一次任务。这似乎比没有调度程序的解决方案更可靠。

    MyJob.run!
    
    (1..8).each |i|
       MyJob.delay(run_at: i.minutes.from_now).run! # create 8 more jobs (each start 1 minute later)
    end
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多