我正在开发一个依赖于调度作业的Heroku应用。我们以前使用的是Heroku调度程序,但时钟进程似乎更灵活和健壮。所以现在我们使用时钟进程在特定时间/间隔将后台作业排队。
Heroku的文档中提到,时钟dynos和所有dynos一样,每天至少重新启动一次--这会导致时钟进程跳过计划作业的风险:“由于dyno每天至少重启一次,因此时钟进程启动时需要存在一些逻辑,以确保在dyno重启期间不会跳过作业间隔。”(参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)
有哪些建议的方法可以确保不跳过计划的作业,并将错过的作业重新入队?
一种可能的方法是每当一个作业运行/排队时创建一个数据库记录,并在时钟作业中定期检查预期记录的存在。这样做的最大缺点是,如果时钟dyno出现系统性问题,导致它停机很长一段时间,那么我就不能每X小时轮询一次,以确保调度的作业成功运行。因为轮询发生在时钟dyno内。
您是如何处理时钟dyno弹性问题的?
谢谢你!
2条答案
按热度按时间tgabmvqs1#
在Heroku上,你没有任何关于你的代码只运行一次和一直运行的信息或保证(因为循环)
您可以在以下项目中使用类似的项目(但不常用):https://github.com/amitree/delayed_job_recurring
或者根据您的需要,您可以创建一个调度程序或进程,它将作业调度到下一个24小时,并且每4小时运行一次,以确保您的作业将被调度。并且希望heroku调度程序至少每24小时工作一次。并且至少有2个工作进程处理作业。
v09wglhw2#
尽管需要人工参与,但我们通过rails中的after_perform挂钩使用Honeybadger签入已调度的作业
这样,当我们碰巧从部署中重新启动的时机不佳时,我们至少知道应该计划的工作实际上没有发生
如果有人有更全面、更简单的解决方案,我很想知道!