【问题标题】:Delayed Job on HerokuHeroku 上的延迟作业
【发布时间】:2011-03-13 18:20:01
【问题描述】:

我有一个托管在 Heroku 上的 Rails 应用程序,需要每周导入一次数据。该任务由管理员执行,运行大约需要 1-2 分钟(计算时间)。在 Heroku 上,需要超过 30 秒 的作业会超时。 Heroku 建议使用作业队列——但是,每月为 8 分钟的计算时间支付 36.00 美元(一名工人的价格)似乎并不合适。几个问题:

  1. 是否可以仅在使用延迟作业时为其付费(即仅在管理员上传数据导入时启动延迟作业服务)。
  2. 是否需要延迟作业?我不确定超时是否只是显示给客户端,或者是否取消了实际工作。文档确实列出了“不采取任何行动”作为选项,但我不确定这意味着什么。

谢谢!

【问题讨论】:

    标签: ruby-on-rails heroku delayed-job


    【解决方案1】:

    您可以查看HireFire

    HireFire 在 Heroku 上自动“雇用”和“解雇”(又名“缩放”)延迟的 Job 和 Resque 工作人员。当没有队列作业时,HireFire 将解雇(关闭)所有工作人员。如果有排队的工作,那么它将雇用(启动)工人。被雇用的工人数量取决于排队工作的数量(比例可以由您配置)。

    【讨论】:

    • 谢谢!我最终做出了切换,但在询问 HireFire 时仍然无法使用。
    【解决方案2】:

    延迟作业工人按秒计费,因此您绝对可以启动一个来处理您的任务,并在完成后通过 heroku API 自行关闭。

    【讨论】:

    • 没错。既然你知道什么时候想跑步,那就很容易了。您可以编写一个脚本来启动工作人员,然后发送请求,然后等待一段时间,然后停止工作人员。每次启动 0.15 时,您都可以让工作人员运行 3 小时。
    【解决方案3】:

    经过测试,意识到超时不会阻止长时间运行的任务完成(只是将结果显示给用户)。最终添加了电子邮件通知并允许发生超时。查看线程请求,但 Rails 中的支持似乎很不稳定。

    【讨论】:

      【解决方案4】:

      是否可以仅在使用延迟作业时为其付费(即仅在管理员上传数据导入时启动延迟作业服务)。

      这是您应该直接向 heroku 支持提出的问题。

      需要延迟工作吗?我不确定超时是否只是显示给客户端,或者是否取消了实际工作。文档确实列出了“不采取任何行动”作为选项,但我不确定这意味着什么。

      如果它每周运行一次,它更有可能是一个 cronjob,而不是只是延迟的。您可以使用daily cron 插件(它是免费的)。然后创建一个名为lib/tasks/cron.rake的文件。

      task :cron => :environment do
        if Time.now.strftime('%w').to_i == 0 # run every sunday
          puts "Importing..."
          #... run import
          puts "done."
        end
      end
      

      source

      这个任务将每天从 heroku 运行,所以如果你想每周运行它,你需要检查星期几。

      【讨论】:

      • 虽然任务每周运行一次,但它需要从电子表格导入数据。因此,运行 CRON 作业并不是一个真正的选择。
      • cronjob 和定期执行的延迟作业之间没有区别。他们都在执行带有一些参数的 ruby​​ 方法。
      • @Damien:Heroku 在付款方面发挥了重要作用。一个延迟的工作可能是由用户交互触发的。 @Kevin:为什么不能从 cronjob 中的电子表格导入,这应该不是问题。
      • 和@Damien 我的理解是“cron”作业是定期执行的 rake 任务。为了进行设置,我需要让管理员 (a) 将电子表格文件托管在可公开访问的目录中,或者 (b) 将电子表格文件存储在数据库中(通过电子邮件发送或发布)。这样做似乎是一个糟糕的解决方案:它不允许实时反馈,它需要发送电子邮件进行确认,如果发生错误,管理员不能轻易重试。此外,我只是在寻找延迟工作问题的答案(不是新的 cron 解决方案)。
      • ' "cron" 作业是定期执行的 rake 任务 ',是的,但您要求' 需要每周导入数据 ',以及您将如何延迟处理,这样您就不需要上传电子表格以便公开使用或将其存储在数据库中?如果它是由延迟的工作完成的,它从哪里获取电子表格?如果有错误,在 cronjob 中,如果它(未)成功,只需让 cronjob 写一封电子邮件,所以如果有错误,你会得到它。如果延迟的工作有问题,您将如何看待?
      猜你喜欢
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多