我刚刚继承了一个 Rails 项目,之前它位于典型的 'nix 服务器上。决定将其移至 Heroku 以供客户使用,由我来决定后台进程是否正常工作。目前它使用Whenever来安排日常事件(电子邮件等)并在启动时启动延迟的作业队列。
Heroku 提供了一个使用发条的自定义时钟过程的文档示例,我可以通过这个示例随时使用它吗?我可能会遇到什么陷阱?我需要创建一个单独的工人测功机吗?
我刚刚继承了一个 Rails 项目,之前它位于典型的 'nix 服务器上。决定将其移至 Heroku 以供客户使用,由我来决定后台进程是否正常工作。目前它使用Whenever来安排日常事件(电子邮件等)并在启动时启动延迟的作业队列。
Heroku 提供了一个使用发条的自定义时钟过程的文档示例,我可以通过这个示例随时使用它吗?我可能会遇到什么陷阱?我需要创建一个单独的工人测功机吗?
是的——Heroku 的 Cedar 堆栈让您可以随心所欲地运行。
Cedar 堆栈的基本构建块是测功机。每个 dyno 都会获得应用程序的临时副本、512 MB RAM 和大量共享 CPU 时间。Web dynos 应该将 HTTP 服务器绑定到$PORT
环境变量中指定的端口,因为 Heroku 将在该端口发送 HTTP 请求,但除此之外,Web dynos 与其他类型的 dynos 相同。
您的应用程序通过在Procfile
. (请参阅使用 Procfile 声明和缩放进程类型。)时钟进程文章演示了一种模式,您可以使用工作人员(即非 Web)测功机根据任意标准将工作排入队列。同样,您可以在这里做任何您想做的事情——只需在 Procfile 中定义它,Heroku 就会愉快地运行它。如果您使用时钟过程(例如 24x7 whenever
),您将使用整个测功机(0.05 美元/小时)除了安排工作之外什么都不做。
在您的情况下,我会考虑从 When 切换到Heroku Scheduler。调度程序基本上是 Heroku 运行的 cron,其中 crontab 条目是“启动测功机并运行此命令”。您仍然需要为额外的测功机支付 0.05 美元/小时,但与时钟 + 工人设置不同,您只需为他们实际运行的时间付费。它将周期性任务与稳定状态的 web + worker 流量清晰地分开,而且通常也便宜得多。
唯一的另一个警告是,在分布式系统中运行周期性任务很复杂,并且具有复杂的故障模式。一些平台事件(对应于大型 EC2 中断)导致了诸如 2 个同步时钟进程和重复调度程序运行之类的事情。如果您正在做一些需要连续运行的事情(例如每天给人们发一次电子邮件),请考虑使用 RDBMS 锁定来保护它,并仔细检查您的日常工作实际上已经过去了大约 23 个小时。
Heroku Scheduler 对于生产使用来说通常是一个糟糕的选择,因为它不可靠并且有时会跳过运行它的任务。
好消息是,如果您使用 Sidekiq 运行作业队列dyno,则可以使用调度插件,例如sidekiq-cron。有了它,您可以使用相同的测功机进行调度。而且,如果您还没有作业工作者,那么如果您需要可靠地运行它,则需要将其设置为仅用于调度。
PS,如果您碰巧运行Delayed::Job来处理排队的作业,那么也有针对它的调度插件,例如这个。