5

我刚刚继承了一个 Rails 项目,之前它位于典型的 'nix 服务器上。决定将其移至 Heroku 以供客户使用,由我来决定后台进程是否正常工作。目前它使用Whenever来安排日常事件(电子邮件等)并在启动时启动延迟的作业队列。

Heroku 提供了一个使用发条的自定义时钟过程的文档示例,我可以通过这个示例随时使用它吗?我可能会遇到什么陷阱?我需要创建一个单独的工人测功机吗?

带有 Clockwork 的 Ruby 中的计划作业和自定义时钟进程

4

2 回答 2

12

是的——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 个小时。

于 2012-09-08T02:59:30.657 回答
2

Heroku Scheduler 对于生产使用来说通常是一个糟糕的选择,因为它不可靠并且有时会跳过运行它的任务。

好消息是,如果您使用 Sidekiq 运行作业队列dyno,则可以使用调度插件,例如sidekiq-cron。有了它,您可以使用相同的测功机进行调度。而且,如果您还没有作业工作者,那么如果您需要可靠地运行它,则需要将其设置为仅用于调度。

PS,如果您碰巧运行Delayed::Job来处理排队的作业,那么也有针对它的调度插件,例如这个

于 2018-01-31T18:49:04.160 回答