如何在不运行rake jobs命令的情况下在Rails 4.2中运行生产中的延迟作业?

时间:2016-08-25 13:48:35

标签: ruby-on-rails delayed-job

在开发模式中,我们使用rake jobs:work。同样,为了在生产模式下进行测试,我们使用RAILS_ENV=production rake jobs:work。 由于整个我的应用程序都在Apache Nginx服务器上,有没有像任何运行后台的gem /代码以及如何在不运行此命令的情况下运行作业的选项?

3 个答案:

答案 0 :(得分:1)

如果你没有Redis,延迟工作是很好的,如果你已经在使用Redis我会推荐Sidekiq而不是延迟工作。主要区别在于延迟作业是基于SQL的作业工作者而Sidekiq使用Redis。

有关使用Sidekiq的详细信息,请查看Sidekiq: Getting Started指南。

延迟还附带了一个在后台运行作业的脚本。

来自README: Running Jobs

script/delayed_job可用于管理后台进程 开始工作。

要执行此操作,请将gem "daemons"添加到Gemfile并确保您已运行rails generate delayed_job

然后您可以执行以下操作:

RAILS_ENV=production script/delayed_job start
RAILS_ENV=production script/delayed_job stop

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

# Set the --queue or --queues option to work from a particular queue.
RAILS_ENV=production script/delayed_job --queue=tracking start
RAILS_ENV=production script/delayed_job --queues=mailers,tasks start

# Use the --pool option to specify a worker pool. You can use this option multiple times to start different numbers of workers for different queues.
# The following command will start 1 worker for the tracking queue,
# 2 workers for the mailers and tasks queues, and 2 workers for any jobs:
RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start

# Runs all available jobs and then exits
RAILS_ENV=production script/delayed_job start --exit-on-complete
# or to run in the foreground
RAILS_ENV=production script/delayed_job run --exit-on-complete

Rails 4: 将bin / delayed_job替换为bin / delayed_job

工作人员可以在任何计算机上运行,​​只要他们可以访问 数据库和它们的时钟是同步的。请记住,每个工人都会检查 数据库至少每5秒钟一次。

您也可以调用rake jobs:work来开始裁员。您可以 使用CTRL-C取消佣金任务。

如果您只想运行所有可用作业并退出,可以使用rake jobs:workoff

通过设置QUEUEQUEUES环境变量来处理队列。

QUEUE=tracking rake jobs:work
QUEUES=mailers,tasks rake jobs:work

还有一些事情:

  1. 您应始终指定要运行的队列。
  2. 您还需要确保在部署应用程序时运行脚本。 (你可以用Capistrano,Mina,Foreman,暴发户和许多其他方式来做到这一点。)

答案 1 :(得分:1)

Miad是正确的,Sidekiq可能就是你要找的东西,除非你真的在谈论使用delayed job gem,这是另一个队列适配器。 Sidekiq基本上是一个连接Rails' ActiveJob Redis {{3}}。您可以使用ActiveJob创建作业,并通过从Job类调用perform方法来启动它们。这会将它们排入Sidekiq队列,将它们传递给redis,它们将异步执行。您的代码可能如下所示: 在(fn* ([G__19829] [(. G__19829 getName) ((partial str "string val: ") G__19829) (. G__19829 getAbsolutePath) (vector G__19829)]))

user> ((juxt+ .getName 
              (partial str "string val: ") 
              .getAbsolutePath 
              vector) 
         (java.io.File. "aaa"))

["aaa" 
 "string val: aaa" 
 "/Users/.../aaa" 
 [#object[java.io.File 0x34c3af49 "aaa"]]]
app/jobs/your_job.rb

中的

class YourJob < ActiveJob::Base
  #specify the name of your queue
  queue_as :the_queue

  # you must define perform, this is where the async magic happens
  def perform(something)
   do_stuff_to(something)
  end
end
app/models/place_where_job_is_kicked_off.rb

中的

class PlaceWhereJobIsKickedOff

  def do_the_jobs
    Something.all.each do |something|
      # enqueue your jobs to be performed as soon as the queueing system is free. The queue size is set in your sidekiq.yml
      # each job will be enqueued and run asynchronously, so watch out for race conditions.
      YourJob.perfom_later(something)
    end
  end
end
app/config/enviroments/production.rb

中的

Rails.application.configure do
 #other production configs...

 #set the ActiveJob queue adapter to sidekiq
 config.active_job.queue_adapter = :sidekiq

 #other production configs...
end

确保已在生产服务器上安装并运行Redis,并且正在运行sidekiq 。将sidekiq gem添加到gemfile并捆绑安装后,运行:

app/config/sidekiq.yml

这将启动sidekiq作为守护进程。

答案 2 :(得分:0)

我认为你要找的是sidekiq宝石。它用于异步运行作业。 http://sidekiq.org