Heroku Scheduler - 为什么要排长期工作

时间:2012-06-21 08:13:27

标签: django heroku sysadmin

Heroku Scheduler的文档说

  
    

“计划作业意味着执行短期运行任务或将更长时间运行的任务排入后台作业队列。任何需要超过几分钟才能完成的任务都应该使用工作进程来运行”

  

https://devcenter.heroku.com/articles/scheduler#longrunning_jobs

如果调度程序为这些作业启动新的dyno并且dyno与worker相同的成本相同,那么将任务添加到队列并让工作进程运行它有什么好处?

2 个答案:

答案 0 :(得分:7)

这是一种架构最佳实践,仅在调度程序任务(或您自己的自定义时钟进程)上调度和不执行间隔任务。在scheduled jobs文章中解释了这一点的动机,但总而言之,您希望您的调度程序进程/任务尽可能轻量级,因为它们应该只有一个。当您开始执行带有执行的调度时,您经常遇到计划冲突和不稳定的行为。

想象一下,一个间隔作业挂起,或者比预期花费的时间长得多。如果你的间隔足够紧,这将开始导致积压,未来的间隔可以一起推回或跳过。

此外,保持组件职责尽可能分离是明智的 - 没有一个组件负责正交任务。这是一种常见的设计实践,它通过保持调度和执行独立性反映在计划的作业用例中。

除了最佳实践之外,如果您处于开发或引导模式并了解上述结果,您当然可以选择忽略此类建议并在调度程序任务中运行所有内容。小心难以调试工作冲突或明显的重复。

答案 1 :(得分:0)

嗯,我认为这只是一个建议。如果您有一个由Scheduler运行的任务,并且您将手动运行此任务(在Heroku管理中),您将收到错误 - 此错误是由超时引起的(因为每个任务都有限制30秒)。但事实上,这项任务不会中断 - 任务将正确完成。

如果您有1个dyno,那么这一个dyno使用Heroku进行应用。如果你运行一些预定的工作,那么这个dyno将被作为调度程序 - >如果您有长时间运行任务,您的页面将“空闲”(直到预定作业完成时才正常工作)。