Heroku时钟流程:如何确保作业不会被跳过?

4ioopgfo  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(101)

我正在开发一个依赖于调度作业的Heroku应用。我们以前使用的是Heroku调度程序,但时钟进程似乎更灵活和健壮。所以现在我们使用时钟进程在特定时间/间隔将后台作业排队。
Heroku的文档中提到,时钟dynos和所有dynos一样,每天至少重新启动一次--这会导致时钟进程跳过计划作业的风险:“由于dyno每天至少重启一次,因此时钟进程启动时需要存在一些逻辑,以确保在dyno重启期间不会跳过作业间隔。”(参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes
有哪些建议的方法可以确保不跳过计划的作业,并将错过的作业重新入队?
一种可能的方法是每当一个作业运行/排队时创建一个数据库记录,并在时钟作业中定期检查预期记录的存在。这样做的最大缺点是,如果时钟dyno出现系统性问题,导致它停机很长一段时间,那么我就不能每X小时轮询一次,以确保调度的作业成功运行。因为轮询发生在时钟dyno内。
您是如何处理时钟dyno弹性问题的?
谢谢你!

tgabmvqs

tgabmvqs1#

在Heroku上,你没有任何关于你的代码只运行一次和一直运行的信息或保证(因为循环)
您可以在以下项目中使用类似的项目(但不常用):https://github.com/amitree/delayed_job_recurring
或者根据您的需要,您可以创建一个调度程序或进程,它将作业调度到下一个24小时,并且每4小时运行一次,以确保您的作业将被调度。并且希望heroku调度程序至少每24小时工作一次。并且至少有2个工作进程处理作业。

v09wglhw

v09wglhw2#

尽管需要人工参与,但我们通过rails中的after_perform挂钩使用Honeybadger签入已调度的作业

# frozen_string_literal: true

class ScheduledJob < ApplicationJob
  after_perform do |job|
    check_in(job)
  end

  private

  def check_in(job)
    token = Rails.application.config_for(:check_ins)[job.class.name.underscore]
    Honeybadger.check_in(token) if token.present?
  end
end

这样,当我们碰巧从部署中重新启动的时机不佳时,我们至少知道应该计划的工作实际上没有发生
如果有人有更全面、更简单的解决方案,我很想知道!

相关问题