任何例子如何大规模更新与延迟的工作在rails中

问题描述 投票:1回答:1

试图理解Rails中的delayed_job,我想更新我的图库中所有已经过期的PIN。

class UpdatePinJob < ApplicationJob
 queue_as :default

 def perform(gallery)
   gallery.where('DATE(expired_pin) > ?', Date.today).update_all('pin = ?', 'new_pin_here')
 end

end

我希望我的问题是有意义的,为什么我在这种情况下使用一个队列,因为我在想如果我的画廊有成千上万的,我想更新所有的,这是我在想使用延迟_job可能会帮助这个规模:)如果我的问题有什么错误,对不起,我在这里试图了解。

ruby-on-rails ruby activerecord delayed-job
1个回答
1
投票

你的方向是对的。我建议你按照这里的说明去做。ActiveJobsBasics

要在你的控制器中调用它,你应该这样做。

# Enqueue a job to be performed as soon as the queuing system is free.
UpdatePinJob.perform_later(gallery)
# Enqueue a job to be performed 1 week from now.
UpdatePinJob.set(wait: 1.week).perform_later(gallery)

一个重要的事情,你应该注意的是关于实际执行工作。根据ActiveJob:

为了在生产过程中执行作业,你需要建立一个排队后端,也就是说,你需要决定Rails应该使用的第三方排队库。Rails本身只提供了一个进程内排队系统,它只将作业保存在RAM中。如果进程崩溃或者机器被重置,那么所有未完成的作业都会在默认的async后台丢失。这对于较小的应用程序或非关键性作业来说可能是好的,但大多数生产应用程序将需要选择一个持久的后端。

我会选择 Sidekiq

不要忘记这样做。


# config/application.rb
module YourApp
  class Application < Rails::Application
    ...
    config.active_job.queue_adapter = :sidekiq
    ...
  end
end

EDIT: 如果你对如何调度感兴趣,那要看你使用的是什么技术. Heroku调度器. 如果你是在数字海洋中部署,你可以使用Cron Jobs。

© www.soinside.com 2019 - 2024. All rights reserved.