Sidekiq Rails 4.2 使用 Active Job 还是 Worker?有什么不同
Sidekiq Rails 4.2 Use Active Job or Worker? What's the difference
这是我的第一个异步处理作业,我正在我的应用程序中实现 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
使用活动作业"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
简而言之,它们是同一回事。 ActiveJob 称它为 Job,而 Sidekiq 称它为 Worker。我决定保留不同的术语,以便人们可以区分两者。
你可以使用任何一个。请注意,ActiveJob 不提供对全套 Sidekiq 选项的访问权限,因此如果您想为您的作业自定义选项,您可能需要将其设为 Worker。
Rails 4.2 添加了 ActiveJob
以统一作业 API 但是对于 运行 它是异步的,你需要一个后台处理程序,这就是 sidekiq 的来源。
Sidekiq 已经有它的 worker class,但它也实现了新的活动作业 class,所以它可以用任何一种方式工作。
然而,主动作业的好处是您可以更改后台处理程序而无需更改代码,前提是它们都支持您想要的功能(例如:在特定时间处理作业;具有多个优先级队列)。
有一个 rails api guide here 包含对支持活动作业的处理程序的良好比较,包括每个处理程序支持的功能。这是比较 table 如果你懒得检查 link:
| | Async | Queues | Delayed | Priorities | Timeout | Retries |
|-------------------|-------|--------|-----------|------------|---------|---------|
| Backburner | Yes | Yes | Yes | Yes | Job | Global |
| Delayed Job | Yes | Yes | Yes | Job | Global | Global |
| Qu | Yes | Yes | No | No | No | Global |
| Que | Yes | Yes | Yes | Job | No | Job |
| queue_classic | Yes | Yes | No* | No | No | No |
| Resque | Yes | Yes | Yes (Gem) | Queue | Global | Yes |
| Sidekiq | Yes | Yes | Yes | Queue | No | Job |
| Sneakers | Yes | Yes | No | Queue | Queue | No |
| Sucker Punch | Yes | Yes | No | No | No | No |
| Active Job Inline | No | Yes | N/A | N/A | N/A | N/A |
| Active Job | Yes | Yes | Yes | No | No | No |
我建议坚持使用原生 sidekiq 以获得更多功能。我也 运行 偶尔遇到 ActiveJob 的一些奇怪的序列化问题。 ActiveJob 在追求实施统一 API 的崇高目标的同时,正是出于这个原因限制了许多实施,并为现在的 IMO 提供了一点好处。就个人而言,我非常渴望在未来的某个时候支付 可能 重写代码的代价(这可能永远不会发生,你不会仅仅为了交换应用程序的关键部分有趣——比如 activerecord vs mongodb) 如果我决定交换更丰富的实现 feature-set.
根据文档,使用 Sidekiq::Worker 比 ActiveJob 可能有性能优势。
https://github.com/mperham/sidekiq/wiki/Active-Job#performance
这是我的第一个异步处理作业,我正在我的应用程序中实现 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
使用活动作业"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
简而言之,它们是同一回事。 ActiveJob 称它为 Job,而 Sidekiq 称它为 Worker。我决定保留不同的术语,以便人们可以区分两者。
你可以使用任何一个。请注意,ActiveJob 不提供对全套 Sidekiq 选项的访问权限,因此如果您想为您的作业自定义选项,您可能需要将其设为 Worker。
Rails 4.2 添加了 ActiveJob
以统一作业 API 但是对于 运行 它是异步的,你需要一个后台处理程序,这就是 sidekiq 的来源。
Sidekiq 已经有它的 worker class,但它也实现了新的活动作业 class,所以它可以用任何一种方式工作。
然而,主动作业的好处是您可以更改后台处理程序而无需更改代码,前提是它们都支持您想要的功能(例如:在特定时间处理作业;具有多个优先级队列)。
有一个 rails api guide here 包含对支持活动作业的处理程序的良好比较,包括每个处理程序支持的功能。这是比较 table 如果你懒得检查 link:
| | Async | Queues | Delayed | Priorities | Timeout | Retries |
|-------------------|-------|--------|-----------|------------|---------|---------|
| Backburner | Yes | Yes | Yes | Yes | Job | Global |
| Delayed Job | Yes | Yes | Yes | Job | Global | Global |
| Qu | Yes | Yes | No | No | No | Global |
| Que | Yes | Yes | Yes | Job | No | Job |
| queue_classic | Yes | Yes | No* | No | No | No |
| Resque | Yes | Yes | Yes (Gem) | Queue | Global | Yes |
| Sidekiq | Yes | Yes | Yes | Queue | No | Job |
| Sneakers | Yes | Yes | No | Queue | Queue | No |
| Sucker Punch | Yes | Yes | No | No | No | No |
| Active Job Inline | No | Yes | N/A | N/A | N/A | N/A |
| Active Job | Yes | Yes | Yes | No | No | No |
我建议坚持使用原生 sidekiq 以获得更多功能。我也 运行 偶尔遇到 ActiveJob 的一些奇怪的序列化问题。 ActiveJob 在追求实施统一 API 的崇高目标的同时,正是出于这个原因限制了许多实施,并为现在的 IMO 提供了一点好处。就个人而言,我非常渴望在未来的某个时候支付 可能 重写代码的代价(这可能永远不会发生,你不会仅仅为了交换应用程序的关键部分有趣——比如 activerecord vs mongodb) 如果我决定交换更丰富的实现 feature-set.
根据文档,使用 Sidekiq::Worker 比 ActiveJob 可能有性能优势。
https://github.com/mperham/sidekiq/wiki/Active-Job#performance