Heroku 上的延迟作业

3
我有一个托管在Heroku上的Rails应用程序,需要每周进行一次数据导入。该任务由管理员执行,需要大约1-2分钟的运行时间(计算时间)。在Heroku上,需要超过30秒的作业会超时。Heroku建议使用作业队列,但是为了8分钟的计算时间支付36.00美元/月(一个工作进程的价格)似乎不合适。以下是几个问题:
  1. 是否可以仅在需要使用延迟作业时支付费用(即仅在管理员上传数据导入时启动延迟作业服务)。
  2. 是否需要延迟作业?我不确定超时是否仅显示给客户端,还是实际工作已被取消。文档确实将“不采取任何措施”列为选项,但我不确定其影响。
谢谢!
4个回答

8

您可以查看HireFire

HireFire可以自动“雇用”和“解雇”(也称为“扩展”)Heroku上的Delayed Job和Resque工作者。当没有队列作业时,HireFire将解雇(关闭)所有工作者。如果有排队的作业,则它会雇用(启动)工作者。被雇用的工作者数量取决于排队作业的数量(比率可以由您配置)。


谢谢!我最终还是做了这个转换,但当我询问的时候,HireFire还没有推出。 - Kevin Sylvestre

2
有没有可能只在需要时支付延迟任务的费用(例如,仅在管理员上传数据导入时启动延迟作业服务)?
这是一个你应该向Heroku支持部门咨询的问题。
是否必须使用延迟作业?我不确定超时是只显示给客户端还是实际工作被取消了。文档确实列出了“不采取任何措施”作为一种选择,但我不确定其含义。
如果它每周运行一次,则更有可能是cron作业而不是延迟作业。您可以使用免费的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

这项任务将从 Heroku 每天运行,因此如果您想每周运行它,您需要检查一下是星期几。

源链接


尽管该任务每周运行一次,但需要从电子表格中导入数据。因此,运行CRON作业并不是一个真正的选择。 - Kevin Sylvestre
一个 cronjob 和一个定期执行的延迟 job 没有区别。它们都执行一个带有一些参数的 Ruby 方法。 - Damien MATHIEU
@Damien:Heroku在付款方面起着重要作用。延迟作业可能是由用户交互触发的内容。 @Kevin:为什么不能在cronjob中从电子表格中导入,这不应该是个问题。 - jigfox
@Damien 我的理解是,“cron”作业是定期执行的rake任务。为了设置这个,我需要管理员将电子表格文件托管在公共可访问目录中,或者将电子表格文件存储在数据库中(通过电子邮件或发布)。这样做似乎是一个糟糕的解决方案:它不允许实时反馈,需要发送电子邮件进行确认,如果出现错误,管理员无法轻松重试。此外,我只是在寻找延迟作业问题的答案(而不是新的cron解决方案)。 - Kevin Sylvestre
“cron”任务是定期执行的rake任务,是的,但您要求“需要每周导入数据”,那么如何使用延迟来完成,以便您无需上传电子表格使其公开可用或将其存储在数据库中?如果通过延迟作业完成,那么它从哪里获取电子表格?如果cronjob出现错误,只需使cronjob在成功或失败时写一封电子邮件,这样如果出现错误,您就会收到通知。那么如何查看延迟作业是否存在问题? - jigfox

1

Delayed Job 的工作进程按秒计费,因此您完全可以启动一个来处理您的任务,并在完成后通过 Heroku API 关闭它自己。


没错。既然你知道何时运行,那就很容易了。你可以编写一个脚本来启动工作进程,然后发送请求,等待一段时间,最后停止工作进程。每次启动它时,你可以让工作进程运行3个小时,看起来只需要0.15的费用。 - Tom Andersen

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接