首页 文章

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

提问于
浏览
2

Heroku Scheduler的文档说明了这一点

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

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

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

2 回答

  • 7

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

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

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

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

  • 0

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

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

相关问题