13

我在我的 rails 应用程序中使用delayed_job 和delayed_job_active_record 来执行后台作业。我们正在使用基于队列的delayed_job。为了启动延迟,我使用以下命令。

RAILS_ENV=staging script/delayed_job -i=1 --queue=queue_name start

问题是下面的查询无限触发。

SQL (0.4ms)  UPDATE `delayed_jobs` SET `locked_at` = '2013-04-16 09:27:23', `locked_by` = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168' WHERE `delayed_jobs`.`queue` IN ('queue_name') AND ((run_at <= '2013-04-16 09:27:23' AND (locked_at IS NULL OR locked_at < '2013-04-16 05:27:23') OR locked_by = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1

delay_job 计数为零。因此,应用程序非常慢,并且页面在很多地方都没有加载。

4

4 回答 4

4

我认为您的意思是delayed_job 轮询过于频繁(顺便说一下5,默认情况下是每秒一次)-我知道这会填满您的日志,并且似乎“无限”.. :)

如果这就是您的意思,那么我建议您运行无用的gem。它只会delayed_job根据需要开始。许多人使用它来防止他们的Heroku worker dynos 闲置,但它在development模式下也能正常工作。

请注意,如果您使用delay_job_active_record,您还需要添加gem 'daemons'到您的Gemfile( daemons )。请参阅 的运行作业部分delayed_job

因此,您Gemfile将包含:

gem 'delayed_job_active_record'
gem 'daemons'
gem 'workless'

如果您需要更多指导,请在下面的评论中告诉我。

于 2013-05-30T18:08:30.787 回答
2

我不得不使用 AR 的silence方法,只需在[path/to/delayed_job_active_record/gem]/delayed_job_active_record-[any.latest.version]/lib/delayed/backend/active_record.rb第 68 行左右更改文件:

count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)

count = silence {ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)}

肮脏的解决方案,我知道,但它有效......欢迎提出更好的包装,但对我来说,Job.reserve方法足够大,可以杀死任何想法来覆盖它config/initializers

于 2014-01-01T18:11:38.047 回答
1

所以这是一个专门为 Postgres 设计的查询。请参阅https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb#L57了解为什么必须这样。

延迟作业的想法确实是它会定期查询数据库,因此只要工作人员正在运行,您问题中的查询就会被触发。这应该每秒发生一次,我无法想象这会对您的应用程序的性能产生重大影响。

您是否在非常有限的硬件上运行,例如非常小的虚拟机?

于 2013-04-17T09:19:59.227 回答
0

我遇到了同样的问题,我通过在队列字段上添加索引来解决它。

def self.up
  create_table :delayed_jobs, :force => true do |table|
  # Add index on queue field
  add_index :delayed_jobs, [:queue], :name => 'delayed_jobs_queue'
end

有关更多信息,请访问以下文档http://himarsh.org/cautions-on-delayed-jobs/

于 2019-05-05T09:45:49.150 回答