我正在构建依赖于预定作业的Heroku应用程序。我们之前使用的是Heroku Scheduler,但时钟进程似乎更灵活,更强大。所以现在我们正在使用时钟进程将特定时间/间隔的后台作业排入队列。
Heroku的文档提到,与所有dynos一样,时钟dynos每天至少重启一次 - 这会导致时钟进程跳过预定作业的风险:"因为dynos重启至少每天一次,在时钟进程启动时需要存在一些逻辑,以确保在dyno重启期间不会跳过作业间隔。" (见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)
有哪些建议的方法可以确保不会跳过预定的工作,并重新排队任何错过的工作?
一种可能的方法是在作业运行/入队时创建数据库记录,并在时钟作业内定期检查预期记录的存在。这样做的最大缺点是,如果时钟dyno的系统性问题导致它在很长一段时间内停机,那么我不能每隔X小时进行一次轮询以确保预定的工作成功运行,因为该轮询发生在时钟dyno内。
你是如何处理时钟dyno弹性问题的?
谢谢!
答案 0 :(得分:1)
您需要在某处存储有关作业的数据。在Heroku上,您没有关于您的代码只运行一次且一直运行的任何信息或保证(因为骑自行车)
你可以使用这样的项目(但不是很常用):https://github.com/amitree/delayed_job_recurring
或者根据您的需要,您可以创建一个调度程序或流程,在接下来的24小时内安排作业,并且每4小时运行一次,以确保您的作业将被安排。并希望heroku调度程序每24小时至少工作一次。 并且至少有2名工人处理这些工作。