0

Rails 的新手和延迟作业的新手。

有一个应该在 5 分钟后触发。我终于让它工作了,所以如果我跑

rake jobs:work

在我的终端中,作业启动并正常工作。如果我在终端中按 CTRL-C 并退出该操作,则延迟的作业将停止正常工作。这是我的本地服务器上的一件事和 Heroku 上的另一件事,我必须使用启动延迟的作业

heroku run rake jobs:work

我查看了新的 Heroku 工具带并下载了他们建议用于工人维护的 gem,工头,但是当我运行“工头启动”时,我收到了这个错误

ERROR: procfile does not exist

我不知道 procfile 是什么,我害怕在花了将近一天的时间调试我的 delay_jobs 操作后破坏了一些东西,我想正确地做这件事以确保它能够正常工作,而不是找出一些破坏的 hacky 修复后来——所以我想我应该问这个问题,不管它可能是多么令人讨厌的模糊。

我应该为此使用工头吗?还是无业?(在另一个 SO 问题中看到了)。我的procfile在哪里?我应该对它做些什么吗?

谢谢,

萨沙

4

2 回答 2

2

您应该使用 aprocfile来设置 Heroku 进程,这是 Heroku 用来定义和控制进程的标准方法。

如果您到目前为止还没有使用 a procfile,那么一切可能仍然有效,因为 Heroku 在您推送 Rails 应用程序时添加了一些默认进程,包括webworker进程。默认worker进程设置为延迟作业。

开发 Foreman 是为了设置您的本地计算机以使用相同的方法,但与 Heroku 服务不同,Foreman 实际上需要一个 procfile 来控制在 Foreman 启动时启动的服务,因为它不知道如何设置默认值。

我建议创建一个procfile, 放置在项目的根目录中,以确保您的进程在本地计算机上的设置和操作方式与在 Heroku 上的方式相同。如果您想模仿 Heroku 自动设置的内容,请procfile根据您是否使用 Thin Web 服务器(Heroku 推荐)添加以下内容。

在您的 gemfile 中使用 Thin:

web: bundle exec thin start -R config.ru -e $RACK_ENV -p $PORT
worker: bundle exec rake jobs:work

如果没有特殊的 Web 服务器(例如,您使用的是 webrick,rails 默认):

web: bundle exec rails server -p $PORT
worker: bundle exec rake jobs:work

一旦这个文件就位,你就可以在你的本地机器上运行工头,它会自动启动你的网络服务器和延迟工作的工作人员。

运行此过程只会影响在本地计算机上启动 delay_job。当您运行与当前使用的完全相同的命令bundle exec rake jobs:work时,应该不会影响您在本地或 Heroku 上的 dj 操作。显然,需要进行一些测试才能使情况确实如此。

Workless 旨在扩展 Heroku 上的工人,这样您就不必在没有可用工作时为他们付费。procfile它与或定义如何实际启动 dj 工作进程无关。

于 2012-10-18T12:37:31.117 回答
-1

据我所知,delayed_job 有 2 个版本:

  1. 原始(托比的) https://github.com/tobi/delayed_job
  2. 集体理念的分叉: https ://github.com/collectiveidea/delayed_job

使用collectiveidea版本时,您应该如下启动它:

# Runs two workers in separate processes.
$ RAILS_ENV=production script/delayed_job -n 2 start

我不熟悉 Heroku 上的延迟作业,请按照它的说明进行操作。

于 2012-10-18T01:15:06.417 回答