这是我第一次异步处理作业,我正在实现Sidekiq来进行应用程序的后台处理。我将使用它来发送提醒电子邮件和应用程序通知。我对于是否应该使用Active Job创建发送电子邮件的作业还是使用Sidekiq Worker发送电子邮件感到困惑。它们似乎做着相同的事情,而Rails 4.2 Active Job似乎很新……它是否替代了使用Sidekiq Worker的需要?
下面是使用Active Job作业和Sidekiq Worker发送邮件的相同代码。我正在使用Whenever gem进行调度。
my_mailers.rb
class MyMailers < ActionMailer::Base
def some_mailer(r.user_id)
@user = User.find(r.user_id)
mailer_name = "ROUNDUP"
@email = @user.email
@subject ="subject text"
mail(to: @email,
subject: @subject,
template_path: '/notifer_mailers',
template_name: 'hourly_roundup.html',
)
end
end
使用 Sidekiq "Worker"
some_worker.rb
class SomeWorker
include Sidekiq::Worker
def perform()
@user = User.all
@reminders = @user.reminders.select(:user_id).uniq.newmade
@reminders.each do |r|
MyMailers.some_mailer(r.user_id).deliver_later
end
end
end
使用Active Job的“Job”
some_job.rb
class SomeJob < ActiveJob::Base
queue_as :mailer
def perform()
@user = User.all
@reminders = @user.reminders.select(:user_id).uniq.newmade
@reminders.each do |r|
MyMailers.some_mailer(r.user_id).deliver_later
end
end
end
我的 Whenever 调度程序中的两个示例 schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
set :path, Rails.root
set :output, Rails.root.join('log', 'cron.log')
#using a worker
every 1.day, :at => '4:30 am' do
runner SomeWorker.perform_async
end
#using a job
every 1.day, :at => '4:30 am' do
runner SomeJob.perform_async
end
Worker
还是Job
进行了一场辩论。作为一个老派人士,我指出了这个答案,并坚持使用Worker
,但最终我还是选择了团队对Job
的偏好。今天,我在发现@MikePerham本人在这里推荐使用Job
之后,完全支持这个决定:https://www.mikeperham.com/2021/11/07/whats-new-in-sidekiq-6.3/ - David Hempy