Heroku时钟进程:如何确保不跳过作业?

ore*_*256 12 cron clock scheduler heroku clockwork

我正在构建一个依赖于预定作业的Heroku应用程序.我们之前使用的是Heroku Scheduler,但时钟进程似乎更灵活,更强大.所以现在我们正在使用时钟进程在特定时间/间隔排队后台作业.

Heroku的文档提到,与所有dynos一样,时钟dynos每天至少重启一次 - 这会导致时钟进程跳过预定作业的风险:"由于dynos每天至少重启一次逻辑需要在时钟进程启动时存在,以确保在dyno重启期间不会跳过作业间隔." (参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)

有哪些建议的方法可以确保不会跳过预定的作业,并重新排队错过的任何作业?

一种可能的方法是在作业运行/入队时创建数据库记录,并在时钟作业内定期检查预期记录的存在.最大的缺点是如果时钟dyno存在系统性问题导致它在相当长的一段时间内停机,那么我不能每隔X小时进行一次轮询以确保预定的作业成功运行,因为轮询发生在时钟dyno内.

你是如何处理时钟dyno弹性问题的?

谢谢!

Luc*_*aye 1

您需要在某处存储有关工作的数据。在 Heroku 上,您没有任何关于代码始终只运行一次的信息或保证(因为循环)

您可以使用这样的项目(但不是很常用):https ://github.com/amitree/delayed_job_recurring

或者,根据您的需要,您可以创建一个调度程序或进程,用于安排接下来 24 小时的作业,并每 4 小时运行一次,以确保您的作业得到安排。并希望heroku调度器至少每24小时工作一次。并且至少有 2 名工人处理这些工作。