Ruby on rails 4 延迟作业数据库

Ruby on rails 4 延迟作业数据库,ruby-on-rails-4,delayed-job,Ruby On Rails 4,Delayed Job,我有一个方法,更新一个帐户的所有DNS记录,每个记录有一个延迟作业。有大量的工作人员和队列,这对快速完成其他工作很有帮助,但是这个特定的工作完成得很快,并淹没了数据库。因为每个作业都需要DNS来解析,所以很难将其移动到收集信息然后写入一次的进程。因此,我正在寻找一种错开延迟工作的方法 据我所知,只要在after方法中使用sleep(0.1)就可以了。我想看看是否有其他人专门处理过这种情况并解决了它 我已经创建了一个自定义作业来测试一些不同的想法。下面是一些示例代码: def update_dns

我有一个方法,更新一个帐户的所有DNS记录,每个记录有一个延迟作业。有大量的工作人员和队列,这对快速完成其他工作很有帮助,但是这个特定的工作完成得很快,并淹没了数据库。因为每个作业都需要DNS来解析,所以很难将其移动到收集信息然后写入一次的进程。因此,我正在寻找一种错开延迟工作的方法

据我所知,只要在after方法中使用
sleep(0.1)
就可以了。我想看看是否有其他人专门处理过这种情况并解决了它

我已经创建了一个自定义作业来测试一些不同的想法。下面是一些示例代码:

def update_dns
  Account.active.find_each do |account|
    account.domains.where('processed IS NULL').find_each do |domain|
      begin
        Delayed::Job.enqueue StaggerJob.new(self.id)
      rescue Exception => e
        self.domain_logger.error "Unable to update DNS for #{domain.name} (id=#{domain.id})"
        self.domain_logger.error e.message
        self.domain_logger.error e.backtrace
      end
    end
  end
end
当一个cron作业调用Domain.update_dns时,延迟的作业表中充斥着数以万计的作业,工作人员开始处理这些作业。工作人员和队列太多,即使设置最低优先级也会使数据库负担过重,其他请求也会受到影响

以下是令人震惊的职业分类:

class StaggerJob < Struct.new(:domain_id)

  def perform
    domain.fetch_dns_job
  end

  def enqueue(job)
    job.account_id      = domain.account_id
    job.owner           = domain
    job.priority        = 10 # lowest
    job.save
  end

  def after(job)
    # Sleep to avoid overwhelming the DB
    sleep(0.1)
  end

  private
    def domain
      @domain ||= Domain.find self.domain_id
    end

end
类作业

这可能完全奏效,但我想验证这种技术是否合理。

结果表明,这些作业的优先级设置为0(最高)。设置为10(最低)有帮助。用后一种方法在工作中睡觉是可行的,但有更好的方法

Delayed::Job.enqueue StaggerJob.new(domain.id, :fetch_dns!), run_at: (Time.now + (0.2*counter).seconds) # stagger by 0.2 seconds

这最终会在作业外部而不是内部暂停。更好

我不确定是什么问题,你能分享一个示例代码吗?还有更多的解释吗?提供了一些详细信息,问题是延迟作业的作业太多了?问题是数据库在处理其他请求时无法处理写入的突发。现在我正试图通过给它一些喘息的空间来解决这个问题,而不是重写这个特性来收集数据,并进行更少、更大的写入。这似乎是目前最短的路径。@Archonic我肯定你不想听,但你应该用Resque或Sidekiq(首选)取代DJ。这不需要做很多工作,而且更好。